c# - 有没有办法使用 MEF 指定导入的元数据?

标签 c# .net .net-4.0 mef .net-4.5

我正在尝试编写一个 ExportProvider,它根据导出和导入上找到的元数据有条件地导出。导出元数据很简单:

[Export(typeof(ITestExport))]
[TestExportMetadata(MetadataStr = "A", MetadataInt = 2)]
public class TestExportClass1 : ITestExport
{
}

检查导出元数据并基于它提供简单的导出。我想要对进口做的事情是类似的,也许像这样:

public class TestImportClass1
{
    [Import(typeof(ITestExport))]
    [TestImportMetadata(MetadataStr = "A", MetadataInt = 2)]
    ITestExport MyExportedValue { get; set; }
}

TestImportMetadata 的实际签名在这里并不重要,只是我想为导入提供某种元数据,并能够在满足导入时引用它。不幸的是,似乎没有设计出等效的流程来将元数据应用于导入,就像导出一样。

ExportProvider基类提供了抽象方法:

protected abstract IEnumerable<Export> GetExportsCore(ImportDefinition definition, AtomicComposition atomicComposition);

我认为提供给此方法的 ImportDefinition 可以让我直接或间接地访问我的元数据或至少访问 ImportAttribute 本身,但事实似乎并非如此。

如果这根本不可能按照我所描述的方式实现,那么在满足导入时,任何人都可以想到提供和访问导入元数据的替代方法吗?

最佳答案

如果您的目标是 .NET 4.5,则可以使用 Microsoft.Composition NuGet package而不是“开箱即用”的 MEF 版本。这有一些功能差异,并不是直接替代,但一项附加功能是 ImportMetadataConstraint 属性:

public class TestImportClass1
{
    [Import(typeof(ITestExport))]
    [ImportMetadataConstraint("MetadataStr", "A")]
    [ImportMetadataConstraint("MetadataInt", 2)]
    public ITestExport MyExportedValue { get; set; }
}

这也适用于自定义元数据属性,因此您也可以编写:

public class TestImportClass1
{
    [Import(typeof(ITestExport))]
    [TestExportMetadata(MetadataStr = "A", MetadataInt = 2)]
    public ITestExport MyExportedValue { get; set; }
}

(请注意,属性需要公开才能在此处用作导入。)

关于c# - 有没有办法使用 MEF 指定导入的元数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12039236/

相关文章:

c# - 按下主页按钮或返回主菜单时取消协程

c# - 什么是最适合实现具有 1000 多个具体实现的接口(interface)的设计模式?

C# 编码。将拉丁语转换为希伯来语

c# - 在 XELement 中搜索一个值

.net - .net 4.5 是否与 .net 4.0 并行工作?

c# - Xamarin vs. Mono vs. Monodevelop

c# - 将项目列表复制到另一个列表

java 如何将字符串发送到服务器(jave.net/sockets)

c# - 数字证书无效

asp.net-mvc-3 - ASP MVC 3 在构建服务器上缺少 WebApplication.targets