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

blu*_*utt 10 .net mef

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

Adi*_*ter 15

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

container.ComposeExportedValue<MyClass>(myClassInstance);
Run Code Online (Sandbox Code Playgroud)

您真正想要的东西可能是新的基于约定的编程模型,它允许您基于命名约定而不是属性创建部件,但此功能仅在.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);
Run Code Online (Sandbox Code Playgroud)

这里可以找到如何使用MEF的新约定模型的一个很好的例子.

希望这可以帮助.


Mar*_*arc 10

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

接口:

[InheritedExport]
public interface IContract { ... }
Run Code Online (Sandbox Code Playgroud)

模块:

// No [Export] attribute
public class ModuleImplementation : IContract { ... }
Run Code Online (Sandbox Code Playgroud)

现在MEF将注入模块.