0

私はIOCのコンセプトに非常に新しいので、さまざまな状況で異なるクラスを解決するのに役立ちます。あなたの呼び出し側クラスはInterfaceとInterfaceとのやりとりで、どの実装があなたに与えるのかを決めるだけで、オブジェクトを新しくすることができます。今IOCとバインディングを理解しようとしています

、私はこれらのプロジェクトに非常に多くの場合、このパターンを参照してください:

private readonly IEmailService emailService; 
private readonly ITemplateRenderer templateRenderer; 
private readonly IHtmlToTextTransformer htmlToTextTransformer; 

public TemplateEmailService(IEmailService emailService, 
    ITemplateRenderer templateRenderer, 
    IHtmlToTextTransformer htmlToTextTransformer) 
{ 
    this.emailService = emailService; 
    this.htmlToTextTransformer = htmlToTextTransformer; 
    this.templateRenderer = templateRenderer; 
} 

私はこのことができますことを理解し、私は私の質問は、それに基づいているので、理解が間違っていた場合

私を修正してくださいこれらのクラスのすべての実装を新しくすることなく使用しています。また、実装する実装を決める必要はありません。あなたのIOCがあなたのために決定します。

しかし、このようなコードでは、IOCの設定ファイルには触れません。そしてもう一度私はgitを2日間だけ使っていますが、私が読んだチュートリアルから、私は自分の "Resolve IParent to Child"クラスを構成することを期待していました。しかし、それは私のようなことをすることなく動作します。これらのインターフェースの実装は1つしかないので、それはありますか?そして、もし私が複数の実装を持っていて、次に私は明示的に解決を構成しなければならないでしょうか?

+0

特定のインターフェイスの実装が1つしかないときは、IOCは独自のものを考え出します(少なくとも構造マップではそうしています)。明示的な設定は、複数の実装がある場合にのみ行う必要があります。 – TeaLeave

+1

一部のIoCおよびDIフレームワークでは、「構成上の規約」パラダイムも使用されます。したがって、もしあなたがIFooを実装している他のクラスを持っていても、このインタフェースを実装するIFooインタフェースとFooクラスがあれば、フレームワークはIFooをFooに解決します。実際にはもっと複雑になることがありますが、これが主なアイデアです。私が知っているように、それはもともとRuby On Railsで考案されており、構造マップもそれをサポートしています(http:// codebetter。com/jeremymiller/2009/01/20/create-your-own-auto-registration-convention-with-structuremap /) – Nikolay

答えて

4

コードサンプルはConstructor Injectionです。伝統的なコードで

、あなたはパラメータなしのコンストラクタを持っているだろうことは、その中にあなたは「新しいアップ」は、このようなあなたのオブジェクトになります。

IEmailService emailService = new EmailService(); 

は、だからあなたのコードは、明示的に実装がに割り当てられますかを制御されますインタフェース変数。

コンストラクタインジェクションを使用するIoCでは、コントロールが反転されます。これは、コンテナが「バスを駆動して」、TemplateEmailServiceオブジェクトを作成していることを意味します。コンテナを作成しようとすると、コンテナはコンストラクタパラメータ(IEmailService、ITemplateRendererなど)を調べ、それらのオブジェクトをクラスにフィードして使用します。

インターフェイスAが実装B(またはC)によって明示的に実行されるようにIoCコンテナを構成できます。それぞれにはそれを行う方法があります。あるいは、それは慣例(Fooによって実現されたIFoo)、またはクラス内の属性でさえそれを行うことができます。

あなたの質問に答えるには、特定のインターフェイスを満たすためにどの実装が使用されるかを明示的に定義することができます。どのようにIoCコンテナのドキュメントを読むことになった。

もう1つ - 「このようなコードを書くと、技術的にはIoCコンテナを使用する必要はありません。実際には、クラスはコンテナへの直接参照を持たないでください。再利用性を最大限に高め、簡単なテストも可能にします。だからあなたは他の場所でインプリメンテーションクラスにインターフェイスをワイヤーアップするでしょう。

+0

ありがとうございました。それは役に立ちました。 – TeaLeave

関連する問題