Unity(依存性注入、制御の反転)に関するMSDNの記事を読んでいますが、簡単な用語(または簡単な例)で説明する必要があると思います。私はMVPCパターン(ここでは使用しています)に精通していますが、このUnityのことをまだ実際に理解することはできず、アプリケーション設計の次のステップだと思います。
6 に答える
Unity は単なる IoC の「コンテナー」です。代わりに Google StructureMap を試してみてください。IoC が初めての場合は、理解するのが少し簡単だと思います。
基本的に、IoC を理解していれば、オブジェクトが作成されたときの制御を反転していることを理解できます。
IOC なし:
public class MyClass
{
IMyService _myService;
public MyClass()
{
_myService = new SomeConcreteService();
}
}
IoC コンテナーの場合:
public class MyClass
{
IMyService _myService;
public MyClass(IMyService myService)
{
_myService = myService;
}
}
IoC がない場合、IMyService に依存するクラスは、使用するサービスの具体的なバージョンを新しくする必要があります。そして、それはいくつかの理由で悪いです (クラスを IMyService の特定の具体的なバージョンに結合した、簡単に単体テストできない、簡単に変更できないなど)。
IoC コンテナーでは、コンテナーを「構成」して、これらの依存関係を解決します。したがって、コンストラクター ベースの注入スキームでは、IMyService 依存関係へのインターフェイスをコンストラクターに渡すだけです。コンテナーで MyClass を作成すると、コンテナーは IMyService 依存関係を解決します。
StructureMap を使用して、コンテナーを構成すると、次のようになります。
StructureMapConfiguration.ForRequestedType<MyClass>().TheDefaultIsConcreteType<MyClass>();
StructureMapConfiguration.ForRequestedType<IMyService>().TheDefaultIsConcreteType<SomeConcreteService>();
つまり、コンテナに「誰かが IMyService をリクエストしたら、SomeConcreteService のコピーを渡してください」と伝えます。また、誰かが MyClass を要求したときに具体的な MyClass を取得することも指定しました。
IoC コンテナが実際に行うことはこれだけです。彼らはもっと多くのことを行うことができますが、それが主旨です - 彼らはあなたのために依存関係を解決するので、あなたがする必要はありません (また、コード全体で "new" キーワードを使用する必要はありません)。
最終ステップ: MyClass を作成するときは、次のようにします。
var myClass = ObjectFactory.GetInstance<MyClass>();
それが役立つことを願っています。お気軽にメールください。
Unity は、他の多くのライブラリと同様に、要求された型のインスタンスを自分で作成しなくても取得できるライブラリです。だから与えられた。
public interface ICalculator
{
void Add(int a, int b);
}
public class Calculator : ICalculator
{
public void Add(int a, int b)
{
return a + b;
}
}
Unity のようなライブラリを使用して、型 ICalculator が IoC (制御の反転) として要求されたときに返される Calculator を登録します (この例は理論的なものであり、技術的に正しくありません)。
IoCLlibrary.Register<ICalculator>.Return<Calculator>();
したがって、ICalculator のインスタンスが必要な場合は...
Calculator calc = IoCLibrary.Resolve<ICalculator>();
通常、IoC ライブラリは、型を解決するたびにシングルトンを保持するか、新しいインスタンスを作成するように構成できます。
ここで、ICalculator が存在することに依存するクラスがあるとします。
public class BankingSystem
{
public BankingSystem(ICalculator calc)
{
_calc = calc;
}
private ICalculator _calc;
}
また、作成時にオブジェクトをコンストラクターに挿入するようにライブラリーをセットアップできます。
したがって、DIまたは依存性注入は、別のオブジェクトが必要とする可能性のあるオブジェクトを注入することを意味します。
Unity は IoC です。IoC のポイントは、型自体の外部にある型間の依存関係の配線を抽象化することです。これにはいくつかの利点があります。まず第一に、これは中央で行われるため、依存関係が変更されたときに多くのコードを変更する必要がありません (単体テストの場合など)。
さらに、コードの代わりに構成データを使用してワイヤリングを行う場合、展開後に実際に依存関係を再ワイヤリングできるため、コードを変更せずにアプリケーションの動作を変更できます。
MSDN には、Unity を使用した依存性注入の開発者向けガイドがあり、役立つ場合があります。
開発者ガイドは、依存性注入の基本から始まり、Unity を依存性注入に使用する方法の例に続きます。2014 年 2 月現在、開発者ガイドは 2013 年 4 月にリリースされた Unity 3.0 を対象としています。