私はしばらくの間 MEF を使用してきましたが、IOC 製品の代わりに MEF を使用する際の重要な要素は、特定のインターフェイスの 3 ~ 5 個の実装が、特定の時間にプラグイン ディレクトリに常駐していることです。これらの実装のどれを使用する必要があるかは、実際には実行時にのみ決定できるものです。
MEF は、まさにそれを可能にします。通常、IOC は、将来のある時点で、ORM Product 1 に基づく IUserRepository を ORM Product 2 に交換できるようにすることを目的としています。ただし、ほとんどの IOC ソリューションでは、特定の時点で有効な IUserRepository は 1 つだけであると想定しています。
ただし、特定のページ リクエストの入力データに基づいていずれかを選択する必要がある場合、通常、IOC コンテナーは途方に暮れます。
例として、私がしばらく取り組んでいる大きな Web アプリの MEF プラグインを介して、アクセス許可のチェックと検証を行います。MEF を使用して、レコードの CreatedOn 日付を確認し、レコードが作成されたときに実際に有効だった検証プラグインを探し、そのプラグインと現在有効なバリデーターの両方を介してレコードを実行し、レコードの有効性を比較できます。時間。
この種の力により、プラグインのフォールスルー オーバーライドを定義することもできます。私が取り組んでいるアプリは、実際には 30 以上の実装用にデプロイされた同じコードベースです。そのため、通常、次のように尋ねてプラグインを探します。
- 現在のサイトと問題の特定のレコード タイプに固有のインターフェイスの実装。
- 現在のサイトに固有のインターフェース実装ですが、あらゆる種類のレコードで機能します。
- あらゆるサイトとあらゆるレコードで機能するインターフェース。
これにより、起動するデフォルトのプラグインのセットをバンドルできますが、その特定の実装が顧客固有のルールで上書きしない場合に限ります.
IOC は優れたテクノロジですが、実際には、具体的な実装ではなく、インターフェイスへのコーディングを容易にすることが目的のようです。ただし、これらの実装を交換することは、IOC でのプロジェクト シフトのようなイベントです。MEF では、インターフェイスと具体的な実装の柔軟性を利用して、多くの利用可能なオプションの中から実行時に決定します。