IoC、DIP、DI、Service Locators に関するさまざまな記事を読みましたが、少し混乱しています。これは、いくつかの記事にはあまりにもあいまいな例があり、他の記事には他のケースについて言及せずに特定の例だけが含まれているためです。
以下の例を見て、どの例がどのパターンに一致するかを簡単に説明してください。
インターフェイスをコンストラクターに手動で渡す:
class Consumer { public Consumer(IStore store){...} } ... Consumer c = new Consumer(new ConcreteStore());
最初の例と同じですが、サードパーティのライブラリ (Unity、Windsor、Ninject) を使用しています
最初の例と同じですが、IStore インターフェイスの代わりに BaseStore クラスを使用しています
コンストラクターではなく、他のメソッドに依存関係を渡します。
class Consumer { public BySomething(IStore store){...} } ... Consumer c = new Consumer(); c.BySomething(new ConcreteStore());
他のインターフェイス内でマスクされた依存関係を渡す (このソリューションのボーナス - 「世界」で他のものが発明され、消費者がそれらを使用したい場合、コンストラクターの引数を変更する必要はなく、IWorld を更新するだけです。完全にテスト時にワールド全体を別のものに置き換えます):
interface IWorld { IDictionary<string,IStore> Stores { get; set; } IDictionary<string,ICityMap> Maps { get; set; } ... } class Consumer { public Consumer(IWorld world){...} public BySomething(string store, string city){...} } ... IWorld myWorld = new HeavenlyWorld(); ... // adding stores, maps and whatnot Consumer c = new Consumer(myWorld);
サブ質問: この場合、IWorld はサービス ロケーターですか、それとも正確ではありませんか?
コールバック関数またはデリゲート (この場合は .NET アクション) を渡します。
c.BySomething(store, city, new Action(() => {...} ));
このケースを追加したのは、 Inversion of Controlの記事で、すべてのコールバックが IoC であると述べられているためです。本当ですか?