0

いくつかのパターンの理論を教えてください。私はそれらを記述しようとしました、私は最善を尽くしましたが、私の記述が間違っていると思うので、助けてください))。理論: "サービスロケータ" "IOCコンテナ" "IOC" "DI"

1) "DI"と "IOC" - 同じ。

2)「IOCコンテナ」 - それはのような依存関係解決できるオブジェクトのインスタンスである:

void Test() 
{ 
    // create IOC Container to resolve 
    // dependences for SomeMethod method 
    var container = new SomeContainer(); 
    container.For(typeof(IEmaleSender), typeof(SuperEmaleSender)); 

    // Pass IOC Container to resolve dependences in SomeMethod 
    SomeMethod(container); 
} 

void SomeMethod(SomeContainer container) 
{ 
    IEmaleSender emailSender = container.Resolve(IEmaleSender); 
    emailSender.SendEmail(); 
} 

3)「をサービスロケータは、」 - それは価値があるDictionary<Type, object>が含まれている静的オブジェクトのようなものですキータイプのインスタンスこの静的オブジェクトには、AddGetの2つのメソッドがあります。だから私は自分のアプリケーションの起動時にオブジェクトを追加し、どこからでも、それを要求することができます。

void Test() 
{ 
    // Assign instanse of SuperEmaleSender to Locator 
    SuperEmaleSender emailSender = new SuperEmaleSender() 
    SomeLocator.Add(typeof(SuperEmaleSender), emailSender); 

    SomeMethod(); 
} 

void SomeMethod() 
{ 
    SuperEmaleSender emailSender = SomeLocator.Get(typeof(SuperEmaleSender)); 
    emailSender.SendEmail(); 
} 

4)「サービスロケータ」と「IOCコンテナ」を組み合わせることをお勧めします。したがって、アプリケーション開始時に "IOC Container"をインスタンス化し、どこからでも "Service Locator"を通じて要求することができます。

5)ASP MVC5では、「サービスロケータ」が既に含まれています。私はDependencyResolverについて話しています。

ありがとうございました。

答えて

1

サービスロケータは、非常に基本的な依存性注入であるALMOSTです。一般的には、シングルトンインスタンスだけを返すことができます。 DIエンジンはあなたに代わって手作業でインスタンスを取得し、新しいオブジェクトを手作業で取得しなければならないため(実際にはDIではありません。新しいオブジェクトとそれらにサービス参照を挿入します) DIを使用すると、オブジェクトの存続期間をより詳細に制御できます。

3

IoCとの組み合わせサービスロケータについて - 適切なIoCコンテナをお持ちの場合は、サービスロケータを使用しないでください(ほとんどの場合は、まったく使用しないでください)。これは、IoCとDIは、クラス外の依存関係を渡し、このクラスが持つ依存関係を明示的に指定することです。内部でサービスロケータを使用すると、依存関係が隠されます。 Service locator is by some people considered an anti-pattern

+0

だから、「IOCコンテナ」 - インスタンスだけではなく、静的なオブジェクトであるので、私はそれを使用するoredeでどこでもにこのコンテナを注入しなければなりませんか? –

+0

1週間後にこのコメントに気づいたことはありがたいですが、最後に気づいたので、私は答えなければならないと思いました。 IoCコンテナは単なるインスタンスですが、どこにでも注入するべきではありません。 IoCコンテナの全目的は、どこにでも注入されることなく依存性を注入することです。 –

0

DIは、Depency InjectionとControl InversionのIoCを表します。 データベースにアクセスするクラスがあるとします。そのクラスの責任は項目を挿入することですが、そのためにはデータベース接続が必要です。クラスの責任がアイテムを挿入するだけであれば、その接続をどのように開始するか、それをどのように使用するかを知ることはできません。それを考えれば、そのクラスの依存関係としてその接続を設定し、その接続を作成したい人にその接続を作成する責任を渡します。依存関係注入を使用してコントロールを反転させ、接続の仕組みを知っている人に責任を引き渡します。

IoCコンテナを使用して、クラス間の依存関係を管理することができます。

あなたは、より詳細な回答のためにこの質問を見ることができます:Inversion of Control vs Dependency Injection

+0

はい、DIとIoCの違いは何ですか?それとも、同じものの名前が違うのでしょうか? –

+1

私はこの答えがあなたに大いに役立つと思う:http:// stackoverflow。com/questions/6550700/inversion-of-control-vs-dependency-injection –

+0

依存性注入はパターンであり、制御の逆転はOOPの原則です。 –