MEF (Managed Extensibility Framework) バージョン2は現在プレビューモードで,その一部が .NET Framework 4.5 のベータ版で公開されている。Microsoft によると,今年後半に予定されている .NET Frame 4.5 に最終サポートリリースが同梱される予定である。
そのリリースに先駆ける形で,Dean Oliver 氏が MEF 2 の最新情報をいくつか詳述 している。(氏の記事にもあるように,これらの項目は最終リリース前に変更される場合がある。) 内容は次のようなものだ。
RegistrationBuilder による属性レス登録
RegistrationBuilder は System.ComponentModel.Composition.Registration の新しいクラスで,パーツ生成とエクスポートの登録を自動的に処理する。これにより,インジェクションを行うオブジェクトの 属性定義 が不要になる。パーツを型にマップするために,RegistrationBuilder では Convention と呼ばれる規則を使用している。ユニークな点は,この Convention がオーバーライド 可能であることだ。
フレキシブルな型登録
RegistrationBuilder を使用する場合,規則の適用対象となる型を決定する方法は3つある。
- ForType(): 単独の型を選択する。
- ForTypesDerivedFrom(): 特定の基本クラスあるいはインターフェースにアサイン可能な型を選択する (MEF 1 の InheritedExport と同じ)。
- ForTypesMatching(Predicate predicate): Boolean セレクタにマッチする型を選択する。これがもっともフレキシブルな選択手段だ。
ひとつの型に複数のルールを適用することが可能であり,干渉のない限りすべてのルールが適用される。
詳細なライフタイムコントロール
MEF 1 ではライフタイムに関する2つのオプション – インスタンス単位と共有グローバルライフタイム – があった。バージョン2では ExportFactory に選択肢が追加され,従属関係にあるインスタンスの生成やパーツのライフタイム制御が可能になっている。
Oliver 氏によれば,
親オブジェクトの生成時にオブジェクトが生成されるのではなく,必要な場合にのみインスタンスにアクセスすることが可能になりました ... これは言わば,作業単位をスコープとしたインポートのようなものです。
Microsoft は CodePlex の MEF ディスカッションフォーラム を通じて,フィードバックと機能提案を引き続き募集している。MEF 2 に関する最新情報の詳細を知るには,BCL チームのブログ を参照してほしい。