web-dev-qa-db-ja.com

MEFコンテナとIoCコンテナの違い(Unity、Autofac、SMap、Ninject、Windsor.Spring.netなど)

私は依存性注入について検索しており、いくつかの記事を読みました。それでも、MEFと他のIoCの違いを見つけることはできません。したがって、私の質問は次のとおりです。どのような状況でMEFまたはIoCコンテナーを使用することを選択すべきですか

(WPF&Silverlight)またはデスクトップアプリケーション用にPRISMでMEFを使用するのが良いのはなぜですか?

一方、Webアプリケーションでは、IoCコンテナーを使用します。

それで、どの依存性テクニックを使うべきかを決める基準は何ですか?

私は記事を読んできました http://devlicio.us/blogs/casey/archive/2009/12/18/what-is-the-difference-between-an-ioc-container-and-mef。 aspx 、しかし、私は何も決定できませんでした。

44
Yogesh

最終的に、MEF対IoCコンテナについて私が結論付けたのは次のとおりです。

MEFは、未知のタイプまたはプラグインベースのアーキテクチャを扱う必要がある場合に使用することをお勧めします。

IoCコンテナーは、既知のタイプで使用することをお勧めします。

さらに、MEFは依存性注入のアーキテクチャソリューションです

一方、IoCコンテナは、依存性注入のためのコードレベルのソリューションです。

IoCコンテナは、クラスのインスタンスを生成する依存関係注入テクニックであり、それらのクラスのコンストラクターが他のクラスのオブジェクトを必要とする場合、IoCは必要なオブジェクトも注入します。しかし、MEFは単なる依存関係の注入以上のことを行います。ただし、MEFは依存関係の注入にIoCベースのアプローチも使用しますが、MEFは依存関係の注入以外にも多くのことを行います。

MEFには2つのコンポーネントがあります。

  1. カタログ:拡張機能の発見を担当

  2. コンテナ:実行中のアプリケーションに拡張機能をロードする機能を提供します

MEFは、依存性注入のテクニック以上のものです。アプリケーションにプラグインベースのアーキテクチャが必要な場合に使用されますが、同時にMEFは依存性注入にIoCベースのアプローチを使用します。

これについてより多くの人がコメントすることを期待しています。

38
Yogesh

IoCはアーキテクチャ設計戦略であり、MEFは設計パターン依存性注入の実装です。多くの場合、依存性注入(DI)はIoCの実装戦略です。多くの場合、IoCコンテナという用語が使用されており、IoCがテクニックであることを示唆しています。

いいえ、そうではありません。 IoCは幅広い概念であり、DIはIoCのコアを実装するための設計パターンです。 MEFは何らかの形式のDIですが、IoCのすべての基本機能を備えているわけではありません。

MEFは構成を使用して、解決する必要がある依存関係を見つけます。これは、他の多くのIoCコンテナー、たとえばPicoや Spring によく似ています。しかし、そこで止まります。ライフサイクル管理もプーリング構成も見ませんでした。後者の2つは、IoCの基本的な部分(DIではなく)であると考えます。これは、呼び出し先のパフォーマンスが、呼び出し先で使用されるメモリ消費のために低下しないためです。

IoCの原則は、発信者と着信者を疎結合することによるサービスです。そうすれば、両方の機能が最適化されて機能します。 MEFには、最適化に問題があるという問題がある場合があります。たとえば、メニューからデータベースへの呼び出しがある場合、いつかはデータベースへの呼び出しが行われます。そのためには常にプーリングを使用するのが最善です。 MEFはそれを行うことができません。

アプリケーションのタイプは、設計パターンの選択から独立している必要があります。デスクトップアプリケーションとWebアプリケーションの間に大きな違いはありません。どちらもユーザーインターフェイスであり、どちらもMEFとIoCを使用できる必要があります。機能が簡単で、最適化の境界を越える必要がない場合(データベースコールなど)、MEFは.NET 4を使用するときに存在するフレームワークであるため、最初の選択肢です。 (ファイルの解析やアップロードなど)最適化の境界を越えた場合、IoCコンテナーの使用はパフォーマンスとメンテナンスにとってより有益です。

使用した情報:

24
Loek Bergman