2

私は MEF を試してきましたが、時折エクスポートが重複していることに気付きました。この単純化された例を作成しました:

次のインターフェイスと、メタデータの属性を作成しました。

public interface IItemInterface
{
    string Name { get; }
}

public interface IItemMetadata
{
    string TypeOf { get; }
}

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property, AllowMultiple = false)]
public class ItemTypeAttribute : ExportAttribute, IItemMetadata
{
    public ItemTypeAttribute(string typeOf)
    {
        TypeOf = typeOf;
    }

    public string TypeOf { get; set; }
}

次に、次のエクスポートを作成しました。

public class ExportGen : IItemInterface
{
    public ExportGen(string name)
    {
        Name = name;
    }

    public string Name
    {
        get;
        set;
    }
}

[Export(typeof(IItemInterface))]
[ItemType("1")]
public class Export1 : ExportGen
{
    public Export1()
        : base("Export 1")
    { }
}


public class ExportGenerator
{
    [Export(typeof(IItemInterface))]
    [ExportMetadata("TypeOf", "2")]
    public IItemInterface Export2
    {
        get
        {
            return new ExportGen("Export 2");
        }
    }

    [Export(typeof(IItemInterface))]
    [ItemType("3")]
    public IItemInterface Export3
    {
        get
        {
            return new ExportGen("Export 3");
        }
    }
}

次のコードを実行します。

AggregateCatalog catalog = new AggregateCatalog();
CompositionContainer container = new CompositionContainer(catalog);
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly().CodeBase));

var exports = container.GetExports<IItemInterface, IItemMetadata>();

foreach (var export in exports)
{
    Console.WriteLine(String.Format("Type: {0} Name: {1}", export.Metadata.TypeOf, export.Value.Name));
}

これは以下を出力します:

タイプ: 1 名前: エクスポート 1
タイプ: 2 名前: エクスポート 2
タイプ: 3 名前: エクスポート 3
タイプ: 3 名前: エクスポート 3

GetExports() を呼び出すと、Export3 の複製が取得されます。エクスポート 1 と 2 は複製されません。(ItemTypeAttribute を使用すると重複することに注意してください。)

タイプ 1 と 2 を削除して「GetExport」を呼び出すと、複数のエクスポートがあるため、例外がスローされます。

Google 検索で1 年前のブログ投稿が 1 件見つかりましたが、解決策やフォローアップはありませんでした

ここで何か間違ったことをしているのですか、それともばかげたことを見逃しているのでしょうか?

(これはすべて VS2010 と .NET 4.0 を使用しています。)

4

1 に答える 1

1

のコンストラクターを次のように変更ItemTypeAttributeします。

public ItemTypeAttribute(string typeOf)
    : base(typeof(IItemInterface)) 
{
    TypeOf = typeOf;
}

を削除します。

[Export(typeof(IItemInterface))]

カスタム属性は から派生しているためExportAttributeです。これは、二重エクスポートを説明しています。

ガイドラインは、CodePlexの MEF のドキュメントの「カスタム エクスポート属性の使用」セクションにあります。

于 2012-11-17T00:52:24.410 に答える