尝试使用 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();
}
}