我正在开发一个服务定位器系统,在该系统中服务可以注册并在代码库周围获得请求。
我遇到的问题,我正在努力做到这一点,如果服务实例已经注册,注册失败,我这样做是这样的:
/// <summary>
/// Registers a service.
/// More than one instance of a service type is allowed.
/// Registration will fail if the same instance has already registered itself.
/// </summary>
public static void Register(IService service)
{
Type type = service.GetType();
List<IService> list = GetServiceList(type, out list);
if (list.IsEmpty())
dic[type] = list;
else if (list.Contains(service))
throw new RegistrationException("[Vervices]: Service instance: `" + service + "` has already registered!");
else if (list.FirstOrDefault(s => s.Identifier == service.Identifier) != null)
throw new RegistrationException("[Vervices]: There already exist a service instance of id: `" + service.Identifier);
list.Add(service);
if (service is MonoBehaviour)
Object.DontDestroyOnLoad(service as MonoBehaviour);
}
我没有做 alist.Contains(service)
我想为什么不让每个服务都有一个HasRegistered
- 当我注册一个服务时,我将它设置为 true。现在界面将如下所示:
public interface IService
{
void Ping(Object sender);
string Identifier { get; }
bool HasRegistered { get; set; }
}
现在我可以做if (service.HasRegistered) throw exception;
而不是if (list.Contains(service) throw exception;
但问题是,这并不安全。该属性同时具有公共设置器和获取器,这意味着任何外人都可以进来做service.HasRegistered = false;
!
它应该设置为 true,仅在内部Register
- 我该怎么做?- 如果我将设置器设为私有,我无法在任何地方设置它,如果我在NotifyHasBeenRegistered()
内部提出IService
相同的问题,外人可能会调用它并导致问题。
我怎样才能以安全的方式做我想做的事?
谢谢你的帮助。