2

尝试使用 GetExports() 加载实例化导出时(使用下面描述的 LINQ 查询),该方法返回 null。我注意到,当我在没有 LINQ 查询的情况下调用 GetExports 时,返回值为 Count: 0。这向我表明 MEF 无法找到已在容器中组合的任何导出。但是,在查看 Container.Catalog.Parts.ExportDefinitions 时,我可以看到 ExportDefinition。关于我哪里出错的任何想法?直到查询的一切似乎都工作正常。

我声明并实现了以下合同和元数据视图:

public interface IMap
{
    void Init();
    int ParseData();
}

public interface IMapMetadata
{
    string MapName { get; }
    string DocumentType { get; }
}

[Export(typeof(IMap))]
[ExportMetadata("MapName", "Map")]
public class Map
{
    public Map()
    {
    }
}

我正在使用以下代码加载包含满足此合同的 DLL 的目录:

    public void LoadByDirectory(string zPath)
    {
        try
        {
            _catalog.Catalogs.Add(new DirectoryCatalog(zPath));
        }
        catch (Exception e)
        {
            String zErrMess = e.Message;
        }

    }

使用 LINQ 查询获取导出:

public IMap GetMapInstance(string zMapName)
{
        IMap ndeMap;

        _container = new CompositionContainer(_catalog);
        _container.ComposeParts(this);

        try
        {
            ndeMap = _container.GetExports<IMap, IMapMetadata>()
                            .Where(p => p.Metadata.MapName.Equals(zMapName))
                            .Select(p => p.Value)
                            .FirstOrDefault();
        }
        catch (Exception ex) 
        {
            throw new Exception("Failed to load map " + zMapName + ": " + ex.Message, ex);
        }

        return ndeMap;
    }

像这样调用上面的方法:

IMap map = mapFactory.GetMapInstance("Map");

返回空值。

更新

除了下面的答案,我忘记在地图类上声明接口,这解决了问题(注意我删除了 DocumentType 属性):

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class MapExportAttribute : ExportAttribute, IMapMetadata
{
    public MapExportAttribute()
        : base(typeof(IMap))
    {
    }

    public string MapName { get; set; }
}

[MapExport(MapName="Map")]
public class Map : IMap
{
    public Map()
    {
    }

    public void  Init()
    {
        throw new NotImplementedException();
    }

    public int  ParseData()
    {
        throw new NotImplementedException();
    }
}
4

1 回答 1

1

看起来您缺少DocumentType导出的元数据:

[Export(typeof(IMap))]
[ExportMetadata("MapName", "Map")]
[ExportMetadata("DocumentType", "???")]
public class Map
{
}

确保您指定正确元数据的最简单方法是自定义导出属性:

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class MapExportAttribute : ExportAttribute, IMapMetadata
{
   public MapExportAttribute() : base(typeof(IMap))
   {
   }

   public string MapName { get; set; }
   public string DocumentType { get; set; }
}

[MapExport(MapName = "Map")]
public class Map
{
}
于 2013-03-12T17:21:34.383 回答