【问题标题】:UnityContainer to get a singleton per serviceUnityContainer 为每个服务获取一个单例
【发布时间】:2017-04-07 02:35:19
【问题描述】:

我有一个 Windows 服务,它为每个注册的 IService 启动多个任务以同时运行。每个 IService 使用几个管理器,每个管理器都使用一个依赖项。我希望在一个服务中的所有管理器中使用一个单一的依赖项(即每个服务都有一个由其管理器共享的依赖项)。我已经向 HeirarchialLifeTimeManager 注册了依赖项。如何创建或注册每个 IService 以使其获得自己的单例依赖项?

var _container = new UnityContainer();
_container.RegisterType<Dependency>(new HierarchicalLifetimeManager());
_container.RegisterType<MgrA1>();
_container.RegisterType<MgrA2>();
_container.RegisterType<MgrB1>();
_container.RegisterType<MgrB2>();
_container.RegisterType<IService, SvcA>("A");
_container.RegisterType<IService, SvcB>("B");

var services = _container.Resolve<IService[]>()
foreach(var svc in services)
{
   Task.Factory.StartNew(() => svc.Start());
}

// dependencies (via constructors)
SvcA(MgrA1, MgrA2)
SvcB(MgrB1, MgrB2)
MgrA1(Dependency)
MgrA2(Dependency)
MgrB1(Dependency)
MgrB2(Dependency)

我想获得 2 个 Dependency 实例,一个用于 SvcA 及其管理器,一个用于 SvcB 及其管理器。我尝试使用 .CreateChildContainer() 在其自己的子容器中注册每个服务,但是当在父容器上调用以获取所有服务并启动它们时,它们无法解析。

【问题讨论】:

    标签: dependency-injection unity-container


    【解决方案1】:

    HierarchicalLifetimeManager 实际上意味着“对于由该容器和任何子容器解析的任何内容,只能有一个实例”。

    如果您将_container.RegisterType&lt;Dependency&gt;(new HierarchicalLifetimeManager()); 设置为_container.RegisterType&lt;Dependency&gt;(new PerResolveLifetimeManager());,然后单独解析您的IServices,而不是作为一个数组,您最终将拥有2 个Dependency 实例,一个用于(MgrA1,MgrA2 ) 和一个用于 (MgrB1, MgrB2)。

    你可以做类似的事情来解决(还没有测试过那个代码,但我做了类似的事情):

    foreach (var containerRegistration in _container.Registrations)
    {
        // If registration type (or interface) implements IService
        if (typeof(IService).IsAssignableFrom(containerRegistration.MappedToType))
        {
            var svc = _container.Resolve(Resolve(containerRegistration.RegisteredType), containerRegistration.Name);
            Task.Factory.StartNew(() => svc.Start());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 2016-01-01
      相关资源
      最近更新 更多