通用Getter用于服务类的集合?

时间:2018-04-20 04:41:06

标签: c# class generics model-view-controller factory

我在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;
}

我对此实施所遇到的问题是双重的;

  1. Service.ServiceNames是一个枚举,每次必须创建一个新的Service类时,都会增加可维护性要求。
  2. 在其中一个服务中检索方法的方法如下所示;

    ((Service.AudioService)[Service.ServiceNames.AUDIO]).DoSomething();

    当我需要将数据从一个服务传递到另一个服务时,这变得难以处理;

    ((Service.ErrorService)[Service.ServiceNames.ERROR]).CreateErrorPopup(((Service.LocaleService)[Service.ServiceNames.LOCALE]).GetString("GENERIC_ERROR"));

  3. 我想要的是某种通用方法,可以在服务类型中获取,然后返回对该服务的引用,而无需由调用者强制转换或使用枚举。我知道<T>泛型的存在,但我从来没有用它们创造过一些东西,而且我不确定存储我的服务然后直接返回它们的好方法。

1 个答案:

答案 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