2016-03-07 42 views
1

我無法確定MEF DisableSilentRejection選項的功能。我想認爲,使用這個選項會提高組合錯誤的清晰度,尤其是在依賴項缺少請求對象下幾個級別的情況下。但是,它似乎對錯誤消息沒有任何影響。CompositionOptions.DisableSilentRejection無法正常工作

我正在使用此測試用例來調查MEF如何報告錯誤。我有一個依賴關係鏈Foo1 - > foo2的 - > Foo3:

[Export] 
public class Foo1 
{ 
    [ImportingConstructor] 
    public Foo1(Foo2 foo2) 
    { 
    } 
} 

[Export] 
public class Foo2 
{ 
    [ImportingConstructor] 
    public Foo2(Foo3 foo3) 
    { 
    } 
} 

[Export] 
public class Foo3 
{ 
} 

而這個代碼從MEF容器請求Foo1對象:

try 
{ 
    using (var exportProvider = new CatalogExportProvider(
      new TypeCatalog(typeof(Foo1), typeof(Foo2)))) 
    using (var container = new CompositionContainer(
      CompositionOptions.DisableSilentRejection, exportProvider)) 
    { 
     exportProvider.SourceProvider = container; 
     container.GetExportedValue<Foo1>(); 
    } 
} 
catch (Exception e) 
{ 
    Console.WriteLine(e.Message); 
    Console.WriteLine(e.StackTrace); 
} 

上面的代碼將打印的組合物的異常,因爲TypeCatalog中缺少Foo3。這就是我的預期。

但是,錯誤消息仍然抱怨缺少Foo1導出,而不是提供有關Foo2-Foo3依賴關係的明確錯誤。這不是DisableSilentRejection應該解決的問題嗎?我錯過了什麼?

回答

2

原來,ExportProvider構造也需要組成選項:

using (var exportProvider = new CatalogExportProvider(
     new TypeCatalog(typeof(Foo1), typeof(Foo2)), 
     CompositionOptions.DisableSilentRejection)) // Added composition options here! 
using (var container = new CompositionContainer(
     CompositionOptions.DisableSilentRejection, 
     exportProvider)) 
{ 
    exportProvider.SourceProvider = container; 
    container.GetExportedValue<Foo1>(); 
} 

,或者,我可以只使用了CompositionContainer構造函數需要直接在目錄:

using (var container = new CompositionContainer(
     new TypeCatalog(typeof(Foo1), typeof(Foo2)), 
     CompositionOptions.DisableSilentRejection)) 
{ 
    container.GetExportedValue<Foo1>(); 
} 

(在我實際使用情況下,我需要優先考慮從一個出口供應商出口到另一個出口供應商,這就是爲什麼我採取更復雜的路線。)