2

インスタンス化されたエクスポートを 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();
    }
}
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 に答える