2
我一直在嘗試使用MEF,並且我注意到我偶爾會得到重複出口。我創建了這個簡化的例子:Duplicate Exports
我創建了以下接口,以及元數據屬性:
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));
}
此輸出:
Type: 1 Name: Export 1 Type: 2 Name: Export 2 Type: 3 Name: Export 3 Type: 3 Name: Export 3
當我調用GetExports()時,我得到Export3的副本,導出1和2不重複。 (注意,當我使用ItemTypeAttribute時,我得到了重複。)
如果我刪除類型1和2,並調用「GetExport」,它會引發異常,因爲有多個導出。
谷歌搜索產生了從一年前的一個single blog帖子,但沒有解決或後續
上午我在這裏做得不對,或可能失去了一些東西愚蠢?
(所有這一切正在使用VS2010和.NET 4.0。)
呵呵,現在我覺得很傻,謝謝。 – dodald