MEF:在CompositionContainer中添加未标有[export]的部件

ILo*_*els 3 .net mef

根据这个问题的答案,CompositionBatch和目录之间的区别是什么?这表明在一些其他组件构建对象的情况下,使用组合批处理非常有用.这让我想到,它适用的现实生活中的例子是什么?然后我开始考虑那些你无法控制的物体.如果无法添加未标记为Export的部件,您将如何将这些实例添加到容器中?我唯一想到的是设置一个具有所需类型成员的类,并将其标记为导出.

如果未将实例标记为导出,是否可以将其添加到容器中?

Wim*_*nen 6

我将假设您的意思是"未标记为导出的类"而不是"实例".

对于.NET4.5及更高版本,您可以使用MEF的常规模型.

对于.NET4,Mark Seemann在博客中发表了关于如何巧妙地使用泛型和属性导出来导出现有类型的博客.你可以创建一个这样的类:

public class MefAdapter<T> where T : new()
{
    private readonly T export;

    public MefAdapter()
    {
        this.export = new T();
    }

    [Export]
    public virtual T Export
    {
        get { return this.export; }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以构造一个类型目录来导出不像MEF一样的现有类型,如下所示:

var catalog = new TypeCatalog(
    typeof(MefAdapter<Foo>),
    typeof(MefAdapter<Bar>), 
    ...);
Run Code Online (Sandbox Code Playgroud)

您可以修改此示例以添加对具有构造函数参数的类型的支持,导出接口而不仅仅是类类型等等.