UnityContainer为每个服务获取单例

时间:2017-04-06 15:56:04

标签: dependency-injection unity-container

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

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()在自己的子容器中注册每个服务,但是当它们在父容器上调用时无法解析以获取所有服务并启动它们。

1 个答案:

答案 0 :(得分:1)

HierarchicalLifetimeManager实际上意味着&#34;对于由该容器解决的任何内容,以及任何子容器&#34;,只能有一个实例。

如果您将_container.RegisterType<Dependency>(new HierarchicalLifetimeManager());设置为_container.RegisterType<Dependency>(new PerResolveLifetimeManager());,然后单独解析IServices,而不是数组,那么您最终会有Dependencyforeach (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()); } } 1}},一个用于(MgrA1,MgrA2),一个用于(MgrB1,MgrB2)。

你可以做一些类似的事情来解决问题(Haven未经过测试的代码,但我已经做了类似的事情):

<td>