私は 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 を使用しています。)