.net - MEF:将未标记为 [export] 的部件添加到 CompositionContainer

标签 .net mef

基于此问题的答案What's the difference between CompositionBatch and catalogs?其中指出,在对象由其他组件构建的情况下,组合批处理的使用非常有用。这让我思考,它适用于现实生活中的哪个例子?然后我开始思考那些你无法控制的构建对象。如果您无法添加未标记为导出的部件,您将如何将这些实例添加到容器中?唯一想到的就是设置一个具有所需类型成员的类并将其标记为导出。

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

最佳答案

我假设您的意思是“未标记为导出的类”而不是“实例”。

对于 .NET4.5 及更高版本,您可以使用 MEF's convention model .

对于 .NET4,Mark Seemann 有 blogged关于如何巧妙地使用泛型和属性导出来导出现有类型。您可以创建一个这样的类:

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; }
    }
}

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

var catalog = new TypeCatalog(
    typeof(MefAdapter<Foo>),
    typeof(MefAdapter<Bar>), 
    ...);

您可以修改此示例以添加对带有构造函数参数的类型的支持、导出接口(interface)而不仅仅是类类型等。

关于.net - MEF:将未标记为 [export] 的部件添加到 CompositionContainer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11112743/

相关文章:

.net - 在 .NET 中调试外部 DLL

c# - 具有 ImportMany 和 ExportMetadata 的 MEF

c# - 如何根据 app.config 多次导出一个 MEF 插件?

.net - 将非托管 DLL 部署到输出目录

c# - IObservable TakeLast(n) 和阻塞

silverlight - MEF 可以下载 Dll(不仅是 Xap)文件吗?

mef - 桌面 MEF 中的 ExportFactory<T> 去了哪里?

windows-services - 在 Windows 服务中使用 MEF?

c# - LINQ 不会用 float 对组求和吗?属性(property)

c# - 用十六进制代码更改表单的背景颜色