2012-02-09 2 views
3

可能性の重複:
Inversion of Control < Dependency InjectionDIとIOC例

誰も私は、単純なC#の例でDIとIOCをしてください理解する助けていただけますか?私が理解しているように、IOCは制御フローの反転(私には何も意味しない)であり、DIはプロパティまたはコンストラクタを介してインターフェイスを注入することを意味します。これらの2つがどのように関連しているかは不明です。

ありがとうございます。

答えて

4

私が説明した説明を参考にしておきます。

あなたが正しく指摘したように、依存性注入は、コンストラクタまたはセッタ注入を介してその共同作業者に要求するクラスの動作です。あなたはこれをコーディングテクニックと考えることができます。一方、制御の反転は、設計手法の多くです - あなたが望むなら、それは哲学です。

手続き型プログラミング(およびOO言語における手続き型プログラミング)では、一般に、ある種の「コマンドと制御」という考え方があります。それぞれいくつかのルームオブジェクトからなる3つのフロアオブジェクトで構成されるハウスオブジェクトを作成する場合、コンストラクタが3つのフロアオブジェクトをインスタンス化する家オブジェクトを作成します。それぞれのコンストラクタはルームオブジェクトをインスタンス化します。

コントロールを反転すると、コマンドとコントロールのパラダイムが反転します。 IoCを使って、私が家をインスタンス化するとき、それは私のためのすべての細部を世話しません。代わりに、そのコンストラクタ(および依存関係注入)を介して、 "あなたはいくつかのフロアなしで私をインスタンス化することはできません"と言います。だから、あなたは階をインスタンス化するために行くと、彼らは "いいえ、いくつかの部屋なしではない"と言う。さて、この「逆さま」スタイルでは、私たちの家は部屋の制作を制御しません。それは誰かにそれを残し、代わりに表現します。これは、コマンドとコントロールを頭で反転させることで、コードの推論とテストのための継ぎ目がよりよくなるため、物事をコンポーネントに分解する方が簡単だからです。

要約すると、制御の反転は哲学であり、依存性注入はそれが達成される手段である。

5

Dependency Injection in .NET本を読むことを強くお勧めします。詳しくは包括的なコード例のすべての側面を説明しています。コントロールの逆転については、Robert Martinの別の本:Agile Principles, Patterns, and Practices in C#を参照するべきです。それは、例と理解できる説明との固体の原則を詳細に説明します。これら2つの本は、私がこれらの原則を理解するのを本当に助けました。

+0

+1です。私はこれらの原則の周りの基本的な質問に答えることができない多くの人にインタビューします。 – Ian

6

のは、あなたがサービスを必要とするクラスがあるとしましょう:が、今ではIEMailSenderだ、それを行うことができるように実装しているオブジェクトを必要とするという意味、IEMailSenderに依存していると言われている

public class A 
{ 
    IEmailSender _emailSender 
    public A(IEmailSender emailSender) 
    { 
    _emailSender = emailSender; 
    } 

    private void SendEmail() 
    { 
    _emailSender.Send(); 
    } 
} 

クラス関数。

ninjectまたはautofacのような依存性注入フレームワークはIEMailSenderを実装するオブジェクトを作成し、のコンストラクタにそれを注入するための責任を負うことになるが、あなたはどのようなオブジェクトを作成することを伝えましたことを条件とします。クラスはIEMailSenderを必要とするたび

Bind<IEmailSender>().To<EmailSender>(); 

これはこれは、私のように単純である彼らに電子メールの送信(電子メールの送信がIEMailSenderインターフェイスを実装することofcourseの仮定)

を与え、ninjectを語っている:ninject使用

例考えることができる、これが役立つことを願っています。

+0

素晴らしいこのコードでコンテナクラスをどのように使用しますか? –

2

DIはIoCである。制御の反転とは、タスクがどのように達成されるかを決定するスワッピングを意味します。

古いworldeでは、LoggerというクラスとそのクラスのLogTime()というメソッドを作成することがあります。現在の時刻をファイルに書き込むことが唯一の目的です。

public void LogTime() 
{ 
    WriteToFile(GetCurrentTime()); 
} 

このクラスには、WriteToFileおよびGetCurrentTimeというメソッドがあります。 IoCは単に、ファイルへの書き込み方法を決定するLoggerクラスの代わりに、現在の時刻を取得することもできます。外部プロバイダにこれらの詳細を提供させることができます。

これはDIが入る場所です。依存関係を注入します。このメソッドは、ファイルへの書き込みと現在の時刻の取得方法に依存します。これらのメソッドを注入します。

プロパティ注入とコンストラクタ注入であるDIには、2つの一般的なパターンがあります。彼らは彼らがスズについて言うことをする。どのように特定のフレームワークが注入を行っているかです。

一部の属性を使用するものもあれば、設定ファイルを使用するものもあります。いくつかは、最良の推測アプローチを採用しています。

DIに沿って、丁寧なDIのようなSL(Service Location)があります。 DIでは、あなたは「この依存性を持ち、好き」と言います。 SLの場合、上記のLoggerクラスは "この依存関係を満たす何かを持つことは可能でしょうか?"と言います。見る?丁寧。

これを動作させるためのコアはインターフェイスです。 LogToFileは、ILogsToFilesインタフェースのメソッドとすることができます。その後、そのインターフェースの6つの異なる実装を持ち、最も適切なものを注入することができます。

これをすべて管理できるフレームワークがありますが、シンプルなServiceLocatorは10行のコードで、単純なDIはおそらく2倍以上です。あなたはすぐに余分にしたいと思うし始めるでしょう。 Ninjectを見てください。私は純粋にそれが小さいとシンプルで、おそらく良い出発地なので、それをお勧めします。

関連する問題