2012-11-16 47 views
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。)

回答

1

變化ItemTypeAttribute的構造器:

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

並取出

[Export(typeof(IItemInterface))] 

因爲您的自定義屬性派生從ExportAttribute。這解釋了您的雙重出口。

可以在CodePlex的MEF's Documentation的「使用自定義導出屬性」一節中找到指導原則。

+0

呵呵,現在我覺得很傻,謝謝。 – dodald