10

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

4

2 回答 2

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 的新约定模型的一个很好的示例。

希望这可以帮助。

于 2012-11-18T08:18:52.710 回答
10

如果您使用InheritedExport属性标记接口,则目录中的所有模块都将被导出,这些模块实现此接口,无论它们是否使用Export属性标记。

界面:

[InheritedExport]
public interface IContract { ... }

模块:

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

现在 MEF 将注入模块。

于 2012-11-22T20:21:18.160 回答