2017-02-07 14 views
1

Unityで登録を設定しようとしていますが、私が必要とするものを正確に取得できません。インスタンスを要求しているクラスに基づいてUnityを解決します

私は以下の定義を持っている想像して次のように

public interface ISomeInterface { ... } 

public interface ISomeDependency { ... } 

public class DependencyA : ISomeDependency { ... } 

public class DependencyB : ISomeDependency { ... } 

public class SomeClassA : ISomeInterface 
{ 
    public SomeClassA(ISomeDependency dep){ ... } 
} 

public class SomeClassB : ISomeInterface 
{ 
    public SomeClassB(ISomeDependency dep){ ... } 
} 

は、私はその後、ユニティに登録:

Container.RegisterType<ISomeDependency, DependencyA>("DependencyA"); 
Container.RegisterType<ISomeDependency, DependencyB>("DependencyB"); 
Container.RegisterType<ISomeInterface, SomeClassA>("ClassA"); 
Container.RegisterType<ISomeInterface, SomeClassB>("ClassB"); 

私もISomeInterfaceオフに基づいてキーを構築する工場を登録します。私はUnityは、このようなUnityは私にSomeClassAのインスタンスを構築するとき、それはまたすることを設定することができますどのように

Container.RegisterType<Func<string, ISomeInterface>(new InjectionFactory(c=> 
{ 
    return new Func<string, ISomeInterface>(x=> 
    { 
     return c.Resolve<ISomeInterface>(x) 
    } 
})); 

(誰でもキー付き工場を作成するためのより良い方法を知っていればちなみに、私は先端を歓迎したい)

DependencyAのインスタンスを挿入しますか? Unityが私にSomeClassBのインスタンスを構築するときと同じように、DependencyBのインスタンスを挿入します。

あなたのお手伝いをお待ちしております。

編集:あなたは一つのインタフェースのための2つの具体的なタイプを登録する場合は、Unityが解決するかを知ることができません

+0

同じオブジェクトグラフで同じインターフェイスの複数の実装を開始したら、[Pure DI](http://blog.ploeh.dk/2014/06/10/pure-di/)が最適なオプションになります。詳細はこの記事をご覧ください:http://criticalsoftwareblog.com/index.php/2015/08/23/why-di-containers-fail-with-complex-object-graphs/ –

+0

工場抽象化の使用(たとえあなたが 'Func 'を使っていても)典型的には[デザインの匂い](https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=100)です。 – Steven

答えて

1

私のタイプミスを修正しました。より多くの情報を提供する必要があります。これを行う1つの方法は、パラメータオーバーライドを使用することです。

// Override the constructor parameter "dep" value 
// Use DependencyA instead of other value 
var result = container.Resolve<ISomeInterface>(
    new ParameterOverride("dep", new DependencyA()) 
     .OnType<SomeClassA>()); 

しかし、あなたはまた、あなたがISomeInterfaceをしたいときに欲しいものを実装の1つUnityに指示する必要がありますので、あなたはまた、ISomeIntefaceの種類としてボットSomeClassASomeClassBを登録しました。