【问题标题】:Is there a way to specify metadata for an Import using MEF?有没有办法使用 MEF 为导入指定元数据?
【发布时间】:2012-08-20 14:08:56
【问题描述】:

我正在尝试编写一个 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 本身,但似乎没有。

如果这根本不可能像我所描述的那样,那么在满足导入时,谁能想到提供和访问导入元数据的替代方法?

【问题讨论】:

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


    【解决方案1】:

    如果您的目标是 .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; }
    }
    

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

    【讨论】:

    • 谢谢,我想这会很有帮助!
    猜你喜欢
    • 1970-01-01
    • 2015-02-15
    • 2020-12-16
    • 2014-08-15
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多