GetExports <type>不返回带有contractName </type>的项目

时间:2011-07-20 13:23:28

标签: c#-4.0 mef

我有MEF出口问题。

我有一个实现一个接口的对象族。它们都使用自定义发布属性发布。属性需要一个作为 ContractName 传递的字符串。此外,属性将 ContractType 设置为一个共享接口。

我的属性类看起来像这样:

public class ItemCreatorAttribute : ExportAttribute, IItemCreatorMetadata
{
    public ItemCreatorAttribute(String type)
        : base(type, typeof(IItemCreator)){..}

如果我只想导入其中一个对象并且我同时使用合同名称和类型,那么一切都很好。但是,我尝试仅按类型(在这种情况下为IItemCreator)获取对象列表失败。

我尝试使用Container.GetExportsImportMany属性获取项目,两种方法均未返回任何结果。

有什么想法吗?

此致 Szymon

修改

我通过遍历Catalog的部分来解决问题,但我仍然在寻找更好的解决方案。

var exportsCollection = new List<ExportDefinition>();
foreach (var export in Container.Catalog.Parts)
{
    foreach (var exportDef in export.ExportDefinitions)
    {
        if (exportDef.Metadata.ContainsKey("ExportTypeIdentity"))
            if (contractType.Equals(exportDef.Metadata["ExportTypeIdentity"]))
                exportsCollection.Add(exportDef);
    }
}

修改2

aL3891我有同样的想法,但是当我试图获得一份只有合同类型的列表然后同时使用合同类型和名称时,我做了一个测试。我的期望是合同类型只返回所有可用的项目。但是,它似乎将其设置为null并搜索具有空合同名称的类型的项目。

// No results
var test = Container.GetExports<IItemCreator>();
// 1 Result
var test2 = Container.GetExports<IItemCreator>("Foo");

1 个答案:

答案 0 :(得分:1)

您要出口的商品是否有自己的进口商品?如果是这种情况而且mef无法满足这些进口,那么它们就不会出现在构图中。

很多次,当我将ImportMany属性归结为空时,因为该属性中的任何内容都没有找到自己的导入。

Mef称之为Stable composition