我有一个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()在自己的子容器中注册每个服务,但是当它们在父容器上调用时无法解析以获取所有服务并启动它们。
答案 0 :(得分:1)
HierarchicalLifetimeManager
实际上意味着&#34;对于由该容器解决的任何内容,以及任何子容器&#34;,只能有一个实例。
如果您将_container.RegisterType<Dependency>(new HierarchicalLifetimeManager());
设置为_container.RegisterType<Dependency>(new PerResolveLifetimeManager());
,然后单独解析IServices
,而不是数组,那么您最终会有Dependency
个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());
}
}
1}},一个用于(MgrA1,MgrA2),一个用于(MgrB1,MgrB2)。
你可以做一些类似的事情来解决问题(Haven未经过测试的代码,但我已经做了类似的事情):
<td>