如何在没有Export属性的情况下导出MEF中的类型? (例如以编程方式)

时间:2012-11-17 18:28:30

标签: .net mef

我似乎无法找到任何文章或指向如何执行此操作的链接,这似乎是一个明显的问题(例如,当您没有源代码或想要使用不是为MEF编写的现有类型时)

2 个答案:

答案 0 :(得分:15)

如果您要将现有对象实例添加到容器中,可以使用CompositionContainer.ComposeExportedValue方法:

container.ComposeExportedValue<MyClass>(myClassInstance);

你真正想要的东西可能是新的基于约定的编程模型,它允许你根据命名约定而不是属性创建部件,但这个功能仅在.NET 4.5中可用。

用法示例(这将导出myAssembly中实现IController IController的所有类型:

var registration = new RegistrationBuilder();

registration.ForTypesDerivedFrom<IController>()
            .Export<IController>();

var catalog = new AssemblyCatalog(myAssembly, registration);
var container = new CompositionContainer(catalog);

如何使用MEF的新约定模型can be found here的一个很好的例子。

希望这有帮助。

答案 1 :(得分:10)

如果使用 InheritedExport 属性标记接口,则会导出目录中的所有模块(实现此接口),无论它们是否标记有 Export 属性

接口:

[InheritedExport]
public interface IContract { ... }

模块:

// No [Export] attribute
public class ModuleImplementation : IContract { ... }

现在MEF将注入模块。