web-dev-qa-db-ja.com

IoCコンテナーの例

IoCコンテナー(c#が望ましい)の良い例と、それらを使用する方法と理由はありますか? wikiページAyende's の例をチェックアウトしましたが、概念はまだよくわかりません。

また、いつどこでIoCコンテナを使用する必要がありますか?

44
Morph

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への直接の呼び出しも回避できます。

お役に立てれば!

56
Jab

IOCコンテナの次の制限に注意してください。それを使用するシステムをサポートしなければならないという地獄に住んでいるので、人々に警告する必要があります。

  • コンストラクターによってスローされた例外は飲み込まれます。 「依存関係を作成できませんでした」例外のみが発生します。つまり、コンストラクターでスローされた場合、予期される例外をキャッチできません。
  • コンストラクターをステップ実行できません。
  • インターフェイスの登録を忘れると、コンパイル時ではなく実行時に壊れます。
  • すべてのクラスはコンストラクターを1つだけ持つことができ、それらはすべてインターフェースをパラメーターとして受け入れる必要があります。
  • すべての依存関係がインスタンス化されるため、インスタンスを共有できません。つまり、メモリ使用量がすぐに大きくなる可能性があります。
  • コードがスパゲッティに変わったという事実を隠すことができる多くの相互依存性を促進します。これらの相互依存関係のすべてを簡単にインスタンス化することは、潜在的な潜在的な問題があることを覆い隠すだけです。
  • インスタンス化とそのトランザクションのコンテキストの受け渡しを制御できないため、複数の依存関係にわたるトランザクションを管理できないため、独自の「作業単位」を非常に簡単に管理することはできません。

誤解しないでください、依存性注入と制御原理の反転が大好きですが、IOCコンテナは責任を持って使用できますが、必要な戦いに注意してください上記のリストのために戦う。

23
Dannie

ボンネットの下のIoCコンテナーとポイント(Dependency Injection)を見たい場合は、DNR TVに素晴らしいポッドキャスト( Episode 126 )があり、実際にそれらを作成する方法について詳しく説明しています。なぜ必要なのでしょうか。それは本当に素晴らしいポッドキャストです。このビデオを見たら、 nity 、- NinjectStructureMap などを見て理解できるようになります。彼らがしていること

8
Joseph

Spring IoC(.net) Java/.netコンテナーを確認してください。ドキュメントは非常に良い紹介です。

簡単に説明すると、IoCは、objects compositionおよびインターフェイスへのプログラミングを奨励するアーキテクチャとして考えることができます

これにより、次のことができます。

  • コードを簡単に単体テストする機能(すべての依存関係をモックアップすることにより、オブジェクトを単独で簡単にテストできます)。

  • 非常に高度な構成(IoCを使用するプログラムは単なるオブジェクトの集まりであり、オブジェクトを結合する構成であるため)。

  • バイトコンパイルされたアプリケーションを拡張または変更する機能(これはJavaに当てはまります。netに当てはまるかどうかはわかりません)。

3
Piotr Czapla

Ninjectを使用するのは、そのシンプルなAPIとオブジェクトの高速解決のためです。非常によく文書化されており、ラムダ式などのC#3.0機能を活用して、仕様を容易にします。

Ninjectでいくつかのスクリーンキャストを見つけることができます こちら

2
Jeffrey Cameron

IoCコンテナを構築しようとしていますか。Spring.NET、StructureMap、Unity Application Blockなどの利用可能なものを使用しないのはなぜですか? ここ は、オープンソースのIoCプロジェクトのリストです

1
Satish

私は通常 StructureMap を使用します-主に構文に精通しているためです。 autofac についても良いことを聞いたことがあり、v2に到達したときに Ninject を試してみるのを楽しみにしています。

this answer をご覧くださいもう少し。基本的に、IoCコンテナーは、すべての依存関係が満たされたオブジェクトを構築するのに役立ち、最小限の構成コードで依存関係を変更できます。

1
Steve Willcock

nity Application Blockの紹介 および ASP.NET StoreFront:Dependency Injection のスクリーンキャストで、Dependency Injectionの概念について詳しく見ることができます。

1
Jozef Izso

IoCコンテナーにUnityを使用していますが、コンテナー間の違いは、DIでできること以上のものです。

DI(Dependency Injection)は主に、プログラムの異なる部分間でより疎な結合を得る方法です。したがって、あなたがそれがどのように機能するかを好きなゲームを書いた場合、DIを使用することにより、ゲームの他の部分を変更せずにゲーム内のキャラクターまたは物理エンジンを変更できます。またはより良いキャラクターが、他に何も変わっていないので、テストはより簡単です。

また、DIを使用すると、たとえば、アプリケーションが使用する実装を変更するだけで、他に影響を与えずにデータベースをモックアウトできるため、単体テストも簡単です。

たとえば、Spring.NETを使用する場合、非常に強力なフレームワークにアクセスできますが、使用しないことは非常に多いので、もっと小さなものを探してください。最善のルールは、ニーズを満たす最小で最も単純な実装を見つけ、それを使用することだと思います。

0
James Black