2017-04-06 7 views
0

あたりのシングルトンを取得します。各IServiceは、それぞれが依存関係を使用するいくつかのマネージャを使用します。私はサービスで(つまり、各サービスにマネージャーが共有しているDependancyのシングルトンを持っている)すべてのマネージャーに依存関係のシングルトンを持たせたいと思っています。私はHeirarchialLifeTimeManagerに登録された依存関係を持っています。依存関係の独自のシングルトンを得るように各IServiceを作成または登録するにはどうすればよいですか?UnityContainerは、私は、各登録IServiceのために同時に実行する複数のタスクを起動するWindowsサービスを持っているサービス

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つの依存関係のインスタンス、SVCAとその経営者のための1、およびSvcBとその経営者のための1つを取得したいです。 .CreateChildContainer()を使用して独自の子コンテナに各サービスを登録しようとしましたが、親コンテナで呼び出されたときに解決されず、すべてのサービスが取得されて開始されます。

答えて

1

HierarchicalLifetimeManagerは、実際には「のみ、そのコンテナによって解決何のためのものの単一のインスタンス、およびすべての子コンテナがある場合もあります」という意味します。

あなたは、代わりの配列として、あなたはDependencyの2つのインスタンス、(MgrA1、MgrA2)用とに1つ(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()); 
    } 
} 
関連する問題