2017-04-06 1 views
0

등록 된 각 IService에 대해 동시에 실행되는 여러 작업을 시작하는 Windows 서비스가 있습니다. 각 IService는 각각 종속성을 사용하는 몇 명의 관리자를 사용합니다. 서비스 (예 : 각 서비스에는 관리자가 공유하는 종속성의 단일 항목이 있음)가있는 모든 관리자에 대해 사용되는 종속성의 단일 항목을 갖 춥니 다. HeirarchialLifeTimeManager에 종속성을 등록했습니다. 각 IService를 작성하거나 등록하여 종속성의 자체 싱글 톤을 얻는 방법은 무엇입니까?서비스 당 싱글 톤을 얻는 UnityContainer

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) 

나는 종속성의 두 인스턴스 SvcA 및 관리자를위한 하나, 및 SvcB 및 관리자를위한 하나 싶어. .CreateChildContainer()를 사용하여 자체 하위 컨테이너에 각 서비스를 등록하려고 시도했지만 부모 컨테이너에서 호출 될 때 해결되지 않아 모든 서비스가 시작되고 시작됩니다.

답변

1

HierarchicalLifetimeManager 실제로는 "해당 컨테이너 및 모든 하위 컨테이너에서 해결 된 모든 것에 대해 단 하나의 인스턴스 만있을 수 있습니다."를 의미합니다.

당신은 대신의 배열로, 당신은 Dependency의 2 인스턴스 (MgrA1, MgrA2)에 대한 하나 하나 (MgrB1 가진 끝장 대신 _container.RegisterType<Dependency>(new PerResolveLifetimeManager());_container.RegisterType<Dependency>(new HierarchicalLifetimeManager());을 설정 한 다음 indivually 당신의 IServices를 해결하는 경우 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()); 
    } 
} 
관련 문제