MEFを使用してプラグインベースのアプリケーションを構築し始めており、ゆっくりとMEFをミックスに追加しています。MEF DNAをまだ持っていない既存のコードはたくさんありますが、それでも、合成によって自動的に作成される新しいオブジェクトにそのコードを取り込みたいと思います。
これを具体的にしましょう。
IFooインターフェイスを実装し、特定の便利な方法でアプリケーションモデルを操作するオブジェクトのリストがあります。
interface IFooCool : IFoo {}
class FooCool : IFooCool {...}
interface IFooAwesome : IFoo {}
class FooAwesome : IFooAwesome {}
IEnumerable<IFoo> fooCollection = ProvidedTheOldFashionWay(not, yet, MEF);
IFooX
ここで、インターフェイスをメニューコマンドやボタンクリックなどのさまざまなユーザーアクションに マップする便利なツールをいくつか作成したいと思います。
[Export(ITool)]
class CoolTool : ITool
{
IFooCool _fooCool;
[ImportingConstructor]
CoolTool(IFooCool fooCool)
{
_fooCool = fooCool;
}
[Export(MenuAction)]
void DoSomething() { _fooCool.SomeWork(...); }
}
これが私がやりたいことです:
var batch = new CompositionBatch();
foreach(var foo in fooCollection)
{
batch.AddPart(foo); //add those legacy objects to the batch
}
var catalog = new TypeCatalog(typeof(CoolTool)); //or assembly or directory, ...
var container = new CompositionContainer(catalog);
container.Compose(batch);
CoolTool
がインスタンス化され、レガシーFooCool
オブジェクトが渡されます。次に、エクスポートされた関数を取得して、メニューに適切に表示します。ユーザーがメニュー項目をクリックすると、新しいものCoolTool
はインターフェースの既存の機能を使用してIFooCool
、何か、まあ、クールなことをします。
もちろん、それは機能しません。レガシーオブジェクトはエクスポートとして関連付けられていないため、コンポジションバッチに追加しても効果はありません。batch.AddPart(object)
上記のコードでは、.の代わりにfooインスタンスをバッチに追加していますbatch.AddPart(ComposablePart)
。最初のメソッドは、属性付きモデルを使用して、オブジェクトから構成可能な情報を検出します。
2番目のオーバーロードをどのように使用できますか?既存の非MEFオブジェクトをその場でComposablePartにラップできますか?何かのようなもの:
batch.AddPart(CreateComposablePart(typeof(IFooCool), foo));
ところで、私は非Silverlightアプリでプレビュー8を使用しています。