我在Unity-C#中构建应用程序,其中所有内容都在MVC模式的App
类下引用。 App
实例将使用多个Service类来执行与数据相关的不同操作,所有这些Service类都派生自Service.ServiceAbstract
,它只包含一个基本构造函数和一个Getter作为参考到相关的App
实例。
理想情况下,我想要的是App
实例本身在某种容器中创建和存储所有服务,以及使用Getter方法返回对所请求服务的引用。目前,它是这样做的;
private Dictionary<Service.ServiceNames, Service.ServiceAbstract> _services = null;
public Service.ServiceAbstract GetService(Service.ServiceNames serviceName)
{
return _services[serviceName] as Service.ServiceAbstract;
}
我对此实施所遇到的问题是双重的;
Service.ServiceNames
是一个枚举,每次必须创建一个新的Service类时,都会增加可维护性要求。在其中一个服务中检索方法的方法如下所示;
((Service.AudioService)[Service.ServiceNames.AUDIO]).DoSomething();
当我需要将数据从一个服务传递到另一个服务时,这变得难以处理;
((Service.ErrorService)[Service.ServiceNames.ERROR]).CreateErrorPopup(((Service.LocaleService)[Service.ServiceNames.LOCALE]).GetString("GENERIC_ERROR"));
我想要的是某种通用方法,可以在服务类型中获取,然后返回对该服务的引用,而无需由调用者强制转换或使用枚举。我知道<T>
泛型的存在,但我从来没有用它们创造过一些东西,而且我不确定存储我的服务然后直接返回它们的好方法。
答案 0 :(得分:0)
您可以使用Type
代替enum
。在这种情况下,您可以使用泛型函数和类型转换。
private Dictionary<Type, Service.ServiceAbstract> _services = null;
public T GetService<T>()
{
return _services[typeof(T)] as T;
}
// And then use
GetService<Service.ErrorService>().CreateErrorPopup(GetService<Service.LocaleService>().GetString("GENERIC_ERROR"));
如果要使用默认构造函数初始化服务,而 if ,则不会有并发线程调用GetService<T>()
,您也可以使用此代码,这将有助于您不初始化{ {1}}手动。
_services