Managed Extensibility Frameworks (MEF) はその名前のとおり,.NET アプリケーションを拡張するためのフレームワークである。先日の Channel 9 のインタビューでは Oleg Lvovitch と Kevin Ransom 両氏が,MEF の歴史とバージョン2の計画について語っている。
MEF には残念なことに,.NET でもっとも誤用されているライブラリという特徴がある。汎用目的の依存性注入(Dependency Injection) フレームワーク,あるいは制御反転(Inversion of Control)コンテナという不適当な役割で,MEF を使おうとしている開発者が少なくない。"new” 演算子の代用として使用している場合さえあるほどだ。Microsoft の Glenn Block 氏は,Managed Extensibility Framework の本来の目的について,次のように説明している。
MEF は汎用 IoC を意図したものではありません。MEF の IoC としての側面を理解するための最良の方法は,その実装の詳細を見ることです。私たちは IoC をパターンとして使用しています。私たちが解決しようとしている問題に対処するには,それが適切な方法だからです。
MEF は拡張性を重視しています。ですから MEF については,それをプラットフォームの将来に対する投資として解釈して頂きたいと思っています。私たちの今後の製品やプラットフォームでは,拡張性を付加する標準機構として MEF が活用されることになるでしょう。サードパーティの製品やフレームワークも,このメカニズムに投資するものと期待しています。MEF の一般的な "ユーザ" は,MEF から参照されるコンポーネントを作成することはあっても,自ら開発するアプリケーションで MEF を直接参照するようなことはないでしょう。
将来的にプラットフォームの拡張が必要になった場合でも,dll を bin フォルダにドロップさえすれば,それだけで作業が完了するのです。MEF は新たな拡張機能によるアプリケーションのライトアップを実現しました。それこそが MEF の目指すところなのです。
MEF の歴史において最も重要なアプリケーションは,何といっても Visual Studio 10 だ。全般的な遅延ローディングや制約レベルの最適化など,多くの機能は Visual Studio のエディタのニーズに応えるためのものだった。Visual Studio の MEF への依存度は,COM ベースの拡張モデルからマネージドコードへの移行が進行するのに伴って,Visual Studio 11 ではさらに拡大している。
MEF 2.0 は要望対応を目的としたバージョンであり,機能の大部分が Visual Studio 開発チーム,あるいはコミュニティ全般からのフィードバックに対処することを目的としている。重要な変更点のひとつは,プログラミングモデルの単純化だ。ホスティング API は,Visual Studio のような複雑なアプリケーションには適切だが,数点の拡張ポイントしか持たないような小さなアプリケーションには過剰な機能なのだ。ただしこれについては現在作業中であり,詳細はまだ明らかではない。
それとは対照的に,MEF ではコンテナ階層のサポートを改善する方法を模索している。これによりコンテナは,それぞれが親から継承したコンテキストに自身のコンテキストを追加するようになる。Visual Studio シェルなども,コンテナのひとつになるかも知れない。プロジェクトごとに複数のコンテナがあり,そのプロジェクトのタイプや保持しているファイルなどの情報をコンテキストに格納する。第3のコンテナは単一ファイル用のエディタになるかも知れない。MEF 1 でもこれは可能だが,あまり洗練された方法ではなかった。
MEF 1 の大きな問題は,構成上の問題に対する調査手段を持たないことだ。MEF のソースコードと適切に配置されたブレークポイントがなければ,正確な原因の診断は非常に難しい作業になる。このようなことが問題とならないように,MEF 2 では多くの努力が払われている。
.NET 4.5 の新機能として,カスタマイズされたリフレクションコンテキストがある。リフレクションコンテキストを使用すれば,クラスに対して,通常の C# コードで記述されたルールに基づいた宣言型属性を実行時に追加することができる。MEF 2 の RegistrationBuilder はこのようなカスタム属性を参照して,それらが最初から存在したかのように動作をする。この方法によって MEF では,ソースコードを参照できないような POCO の利用も可能となっている。
MEF は Windows 8 の Metro アプリケーションでも使用可能だが,その形式にはかなりの違いがある。高度な機能は大部分が削除されていて,残るのは MEF の主要機能である拡張ポイントの公開と拡張のロードが中心となっている。