我开始使用 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
界面现有的功能做一些事情,嗯,很酷。
当然,这是行不通的。由于遗留对象不属于导出,因此将它们添加到组合批处理中没有帮助。在上面的代码中,我将 foo 实例添加到批处理中,batch.AddPart(object)
而不是batch.AddPart(ComposablePart)
. 第一种方法使用属性模型从对象中发现可组合信息。
如何使用第二个重载?我可以动态地将现有的非 MEF 对象包装在 ComposablePart 中吗?就像是:
batch.AddPart(CreateComposablePart(typeof(IFooCool), foo));
顺便说一句,我在非 Silverlight 应用程序中使用预览 8。