IoCコンテナー(c#が望ましい)の良い例と、それらを使用する方法と理由はありますか? wikiページ と Ayende's の例をチェックアウトしましたが、概念はまだよくわかりません。
また、いつどこでIoCコンテナを使用する必要がありますか?
StructureMap をかなり使いました。質問の残りの部分はかなり盛り込まれています。例で概念を説明しようとします。
Paypalを介して支払いを受け付けるWebサイトを作成したとします。 Paypalは依存関係になりました。ただし、特定のPaypalプロバイダーに対してコーディングする必要はありません。
代わりに、次のようなインターフェイスを作成してコーディングします。
interface IPaymentProcessor
{
bool ProcessPayment(amount, ....);
}
すべてのPaypalコードは、インターフェースのメソッドを実装するクラス(たとえば、PayPalPaymentProcessor
)に常駐します。
これで、支払いの処理に実際に使用するオブジェクトができました。これは、コントローラー(ASP.NET-MVC、ViewModel-WPF)または次のように単なるクラスになります。
class PaymentProcessor
{
private IPaymentProcessor _processor = null;
public PaymentProcessor(IPaymentProcessor processor)
{
_processor = processor;
}
public bool ProcessTransaction(Transaction trans)
{
_processor.ProcessPayment(trans.amount, ...);
}
}
これがIoCコンテナーの出番です。コンストラクターを手動で呼び出す代わりに、IoCコンテナーにinject依存関係を許可します。
PaymentProcessor processor = ObjectFactory.GetInstance<PaymentProcessor>();
このコードは、StructureMapに「IPaymentProcessor
を必要とするコンストラクターが表示されるたびに、新しいPayPalPaymentProcessor
を返します」と伝えます。
ObjectFactory.Initialize(x =>
{
x.ForRequestedType<IPaymentProcessor>().TheDefaultIsConcreteType<PayPalPaymentProcessor>();
});
このマッピングはすべて実装コードとは別個のものであり、後からリファクタリングをほとんど必要とせずに交換できます。 IoCコンテナにはさらに多くの機能がありますが、それは基本的な概念です。コンストラクターの注入を自動化して、ObjectFactory
への直接の呼び出しも回避できます。
お役に立てれば!
IOCコンテナの次の制限に注意してください。それを使用するシステムをサポートしなければならないという地獄に住んでいるので、人々に警告する必要があります。
誤解しないでください、依存性注入と制御原理の反転が大好きですが、IOCコンテナは責任を持って使用できますが、必要な戦いに注意してください上記のリストのために戦う。
ボンネットの下のIoCコンテナーとポイント(Dependency Injection)を見たい場合は、DNR TVに素晴らしいポッドキャスト( Episode 126 )があり、実際にそれらを作成する方法について詳しく説明しています。なぜ必要なのでしょうか。それは本当に素晴らしいポッドキャストです。このビデオを見たら、 nity 、- Ninject 、 StructureMap などを見て理解できるようになります。彼らがしていること
Spring IoC(.net) Java/.netコンテナーを確認してください。ドキュメントは非常に良い紹介です。
簡単に説明すると、IoCは、objects compositionおよびインターフェイスへのプログラミングを奨励するアーキテクチャとして考えることができます。
これにより、次のことができます。
コードを簡単に単体テストする機能(すべての依存関係をモックアップすることにより、オブジェクトを単独で簡単にテストできます)。
非常に高度な構成(IoCを使用するプログラムは単なるオブジェクトの集まりであり、オブジェクトを結合する構成であるため)。
バイトコンパイルされたアプリケーションを拡張または変更する機能(これはJavaに当てはまります。netに当てはまるかどうかはわかりません)。
Ninjectを使用するのは、そのシンプルなAPIとオブジェクトの高速解決のためです。非常によく文書化されており、ラムダ式などのC#3.0機能を活用して、仕様を容易にします。
Ninjectでいくつかのスクリーンキャストを見つけることができます こちら
IoCコンテナを構築しようとしていますか。Spring.NET、StructureMap、Unity Application Blockなどの利用可能なものを使用しないのはなぜですか? ここ は、オープンソースのIoCプロジェクトのリストです
私は通常 StructureMap を使用します-主に構文に精通しているためです。 autofac についても良いことを聞いたことがあり、v2に到達したときに Ninject を試してみるのを楽しみにしています。
this answer をご覧くださいもう少し。基本的に、IoCコンテナーは、すべての依存関係が満たされたオブジェクトを構築するのに役立ち、最小限の構成コードで依存関係を変更できます。
nity Application Blockの紹介 および ASP.NET StoreFront:Dependency Injection のスクリーンキャストで、Dependency Injectionの概念について詳しく見ることができます。
IoCコンテナーにUnityを使用していますが、コンテナー間の違いは、DIでできること以上のものです。
DI(Dependency Injection)は主に、プログラムの異なる部分間でより疎な結合を得る方法です。したがって、あなたがそれがどのように機能するかを好きなゲームを書いた場合、DIを使用することにより、ゲームの他の部分を変更せずにゲーム内のキャラクターまたは物理エンジンを変更できます。またはより良いキャラクターが、他に何も変わっていないので、テストはより簡単です。
また、DIを使用すると、たとえば、アプリケーションが使用する実装を変更するだけで、他に影響を与えずにデータベースをモックアウトできるため、単体テストも簡単です。
たとえば、Spring.NETを使用する場合、非常に強力なフレームワークにアクセスできますが、使用しないことは非常に多いので、もっと小さなものを探してください。最善のルールは、ニーズを満たす最小で最も単純な実装を見つけ、それを使用することだと思います。