あなたはIOCコンテナに結合されたセットアップコードで終わるでしょうが、それは問題ありません。重要な点は、セットアップは常にアプリケーションのコンポジションルートで行われることです。つまり、クラスが使用される前に、アプリケーションの起動時に依存関係が指定されます。クラス自体は、コンテナの認識や依存関係の作成方法を意識することなく動作します。
これらはあなたのFoo
クラスとインタフェースしていると仮定します。
public interface IFoo { }
public interface IFooConfig { }
public class Foo : IFoo
{
private readonly IFooConfig _config;
public Foo(IFooConfig config)
{
_config = config;
}
}
public class FooConfigA : IFooConfig { }
public class FooConfigB : IFooConfig { }
ここではいくつかのコンテナコードです。ご覧のとおり、複雑になります。あなたの依存関係が小さくてシンプルであれば、それは価値がないかもしれません。
例としてWindsorを使用すると、設定は次のようになります。それを行う方法は2つ以上ありますので、より簡単かどうかを判断しておきます。
container.Register(
Component.For<IFooConfig, FooConfigA>().Named("FooConfigA"),
Component.For<IFooConfig, FooConfigB>().Named("FooConfigB"),
Component.For<IFoo, Foo>()
.DependsOn(Dependency.OnComponent<IFooConfig, FooConfigA>()).Named("FooA")
.IsFallback(),
Component.For<IFoo, Foo>()
.DependsOn(Dependency.OnComponent<IFooConfig, FooConfigB>()).Named("FooB"));
IFoo
という名前の2つの登録があります。それぞれが同じタイプのオブジェクト(Foo
)を返しますが、それらのインスタンスのそれぞれの実装はIFooConfiguration
です。
それとも、Settings.Default
から来IFooConfigのインスタンスを使用している場合、あなたはこれを行うだろう:
Component.For<IFoo, Foo>()
.DependsOn(Dependency.OnValue("config", Default.Settings.FooConfigA))
.Named("FooA")
.IsFallback(),
Component.For<IFoo, Foo>()
.DependsOn(Dependency.OnValue("config", Default.Settings.FooConfigB))
.Named("FooB"),
は今IFoo
に依存し、各クラスのためにあなたが名前によってどのバージョンあなたを指定することもあるだろう取得するか、それはフォールバックとして指定されているので、あなたはちょうど "A"を取得します。
ご覧のとおり、これはすぐに乱雑で複雑になります。可能であれば、抽象ファクトリを使用して、依存関係の各組み合わせに対してIFoo
の個別の登録を行う代わりに、実行時に実装を選択する方法もあります。 Here's some more explanation and an example.。
あなたはウィンザー(と私は他のコンテナが同様の行動を持っていると確信している)を使用している場合は、IEnumerable<IFoo>
やFoo[]
を取るコンストラクタを持つことができ、その後、ウィンザーはすべて実装を解決し、コンストラクタに渡します。あなたは、コンテナのセットアップにこれを追加します。
container.Kernel.Resolver.AddSubResolver(new ListResolver(container.Kernel, true));
[Unity](https://msdn.microsoft.com/en-us/library/ff649564.aspx)IoCコンテナはサンプルコードと互換性がありますが、IoCコンテナはそれを単純化することができます。 –
質問に含まれているタイプよりも具体的なニーズが少ない他の依存関係がある場合は、プロジェクト全体を単純化しないとは限りません。 –
[this](http://blog.ploeh.dk/2012/11/06/WhentouseaDIContainer/)と[this](https://simpleinjector.org/blog/2015/12/when-should-you)をお読みください。 -use-a-container /)。すべてのアプリケーションがDIコンテナを使用する利点はありません。 – Steven