インスタンス化されたエクスポートを GetExports() (後述の LINQ クエリを使用) で読み込もうとすると、メソッドは null を返します。LINQ クエリを使用せずに GetExports を呼び出すと、戻り値が Count: 0 になることに気付きました。ただし、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");
null を返します。
更新しました
以下の回答に加えて、マップ クラスでインターフェイスを宣言するのを忘れていました。これで問題が解決しました (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();
}
}