ここでは、Ioc(Inversion of control)という概念について話しています。 私はこの概念をかなり長い間使ってきました。通常、私は自分のコードにIoCを実装するためのDI(サービス・ロケータではなく)アプローチを採用しています。 以下はIoCについての私の理解です。制御の逆転と依存性注入
classAがその内部にclassBのインスタンスを宣言する場合、classAはclassBに依存している場合。それはclassBに依存している、何らかの理由で(私は後でそれに来る)、良くないので、これを修正するためにDIを使用する。そこで、クラスAのコンストラクタで渡されるIClassBというインタフェースがあります(ここでは、コンストラクタインジェクションを取り上げています)。ここでコードが行く:
public class ClassA
{
IClassB _classBObj = null;
public ClassA(IClassB classBObj)
{
_classBObj = classBObj;
}
public void UseClassBMethod()
{
this._classBObj.classBMethod();
}
}
public class ClassB:IClassB
{
public void classBMethod()
{
//Some task carried out by classB.
}
}
public interface IClassB
{
void classBMethod();
}
そして、ここではそれを実行している行かせるコードを行く:
class Program
{
static void Main(string[] args)
{
//This code is outside of class A and hence declaring
//object of ClassB is not dependency
ClassA classA=new ClassA(new ClassB);
classA.UseClassBMethod();
}
}
私はのIoCとDIの私の理解が正しいかどうかだけを確認するために、上記の例を示しました。間違ったことが見つかったら、私に修正してください。
テスト容易性:確かに正しいの懸念私は理由のIoCを見つけることを試みながら 今、私は2つの重要な理由を見つけました。上記の例では、classBメソッドがSMPTPサーバーまたは一部のWCF/Webserviceを使用すると仮定してテストすることができない場合があります。ただし、インターフェイスIClassBを実装するテストスタブクラスを作成し、テストスタブクラスのインスタンスを渡すことでテストを進めることができます。
具体的な実装の依存性:これは私が一緒にはできないものです。
public class ClassA
{
ClassB _classBObj = null;
public ClassA()
{
_classBObj = new ClassB();
}
public void UseClassBMethod()
{
this._classBObj.classBMethod();
}
}
どのようにIoCのが原因ClassBのオブジェクトのClassBの方法の変更により生じたいかなる問題を取り除くために役立っている:私は、次のコードでクラスAのコードを変更した場合でも?メソッドのシグネチャに変更があった場合は、IClassBのメソッドシグネチャのインタフェースを変更する必要があります(実際はリファクタリングタスクが増えています)。メソッドの実装の変更が、たとえば追加のロギングタスクを必要とするとすると、変更はClassBコードに制限されます。
私は質問で少しばかげているかもしれませんが、(ユニットテスト容易性を除けば)このアプローチによって恩恵を受けているシナリオを提示することができますか?
お読みいただきありがとうございます。
これらの投稿がお役に立てば幸いです。 [IoC(Inversion of Control)、DI(Dependency Injection)、完全にデカップリングされたレイヤーを使用した3つのタイヤアプリケーションのアイデア](http://rizviof0.wordpress.com/2012/09/06/an-idea-of-a - 3つのタイヤアプリケーション - 制御逆依存性の注入と完全に分離された層の逆転を使用して)[DI(Dependency Injection)を伴うmvc Webアプリケーションで使用される単純なコンテナ](http:// rizviof0 .wordpress.com/2012/09/06/a-simple-container-in-mvc-web-applications /) –