2016-04-19 4 views
1

私はUnityをコンテナとして使用しています。問題を解決するのに役立つかどうかは疑問です。私は2つのサービス、Service1とService2を持っています。彼らはどちらも別のオブジェクトに依存しており、IFooと呼ぶことができます。私は各サービスが独自のIFooのインスタンスを取得したいと思っていますが、同時に私は他の人にはしたくありません。基本的にはシングルトンでなければなりませんが、スコープがあります。私はこれを達成するために子コンテナの組み合わせを使用することを考えましたが、私が望むように動作しません。アイデアは、IFooにはService1とService2に固有の接続の詳細と他のいくつかのコンテナで解決されたオブジェクトが含まれているということです。以下は、うまくいけばそれを明確にするコードです。コンテナ階層

ViewControllerを解決するコードは、parentContainerについてしか知りません。

var parentContainer = new UnityContainer(); 
parentContainer.RegisterType<IParentScope, ParentScoped>(
    new ContainerControlledLifetimeManager()); 

var childContainer1 = parentContainer.CreateChildContainer(); 
childContainer1.RegisterInstance<IFoo>(new Foo("Unique to Child Container 1"), 
    new ContainerControlledLifetimeManager()); 
childContainer1.RegisterType<IService1, Service1>(
    new ContainerControlledLifetimeManager()); 

var childContainer2 = parentContainer.CreateChildContainer(); 
childContainer2.RegisterInstance<IFoo>(new Foo("Unique to Child Container 2"), 
    new ContainerControlledLifetimeManager()); 
childContainer2.RegisterType<IService2, Service2>(
    new ContainerControlledLifetimeManager()); 

var viewController = parentContainer.Resolve<ViewController>(); 


public class ViewController 
{ 
    public ViewController(IParentScope parentScope, IService1 service1, IService2 service2) 
    { 
     ParentScope = parentScope; 
     Service1 = service1; 
     Service2 = service2; 
    } 

    public IParentScope ParentScope { get; set; } 
    public IService1 Service1 { get; set; } 
    public IService2 Service2 { get; set; } 
} 
+0

特定のユースケースを説明したいと思うかもしれません。これは、私の見解ではあなたのアプローチに欠陥があるためです。あなたはあなたの質問を更新し、あなたが何をしているのかについての詳細を提供することができますか(実際のクラス名とあなたのやっていることを示すコード)? – Steven

+0

Service1と2がIFooのインスタンスを共有したくないのですが、他のサービスはどうですか?彼らはService1またはService2に与えられたインスタンスを共有しようとしていますか?なぜそれがシングルトンである必要がありますか? –

答えて

1

ご意見ありがとうございます。私はおそらくそれをとてもうまく説明しなかったかもしれませんが、そういう名前の登録を使って動作させることができると分かりました。

var foo1 = new Foo("FOO 1"); 
     parentContainer.RegisterInstance<IFoo>("Foo1", foo1); 

     var foo2 = new Foo("FOO 2"); 
     parentContainer.RegisterInstance<IFoo>("Foo2", foo2); 

     parentContainer.RegisterType<IService1, Service1>(new ContainerControlledLifetimeManager(), new InjectionConstructor(new ResolvedParameter<IFoo>("Foo1"))); 
     parentContainer.RegisterType<IService2, Service2>(new ContainerControlledLifetimeManager(), new InjectionConstructor(new ResolvedParameter<IFoo>("Foo2"))); 

もっと良いオプションは、Service1コンストラクタで[Dependency( "Foo1")]属性を使用することを発見しました。これにより、単一の名前付き依存関係を指定することができます。