2011-04-15 56 views
6

這是類似我的代碼看起來MEF Container.Dispose配置添加的目錄嗎?

var catalog = new AssemblyCatalog(typeof(Program).Assembly); 
_container = new CompositionContainer(catalog); 

代碼分析是表示警告CA2000:調用Dispose目錄中之前,它的所有引用超出範圍。

所以我不確定是否需要禁止警告或將_catalog轉換爲字段+解決它。

MEF Docs似乎沒有提到這一點。

回答

4

根據MEF Preview 9源代碼(可能與.NET 4中提供的代碼密切匹配),CompositionContainer將把目錄封裝在CatalogExportProvider中。此導出提供程序存儲在一個字段中,並與容器一起處理。然而,CatalogExportProvider.Dispose而不是依次處置包裹ComposablePartCatalog

因此答案是否定的:CompositionContainer不配置目錄。

您可以通過運行該代碼,這將不再打印到控制檯驗證這一點:

class MyCatalog : ComposablePartCatalog 
{ 
    protected override void Dispose(bool disposing) 
    { 
     Console.WriteLine("Disposed!"); 
     base.Dispose(); 
    } 

    public override IQueryable<ComposablePartDefinition> Parts 
    { 
     get { throw new NotImplementedException(); } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var container = new CompositionContainer(new MyCatalog()); 
     container.Dispose(); 
     Console.ReadKey(); 
    } 
} 
+0

啊!創建自定義子類技術:)我的反射器副本耗盡,這是一個星期五,所以貼在SO上。謝謝Wim! – Gishu 2011-04-16 14:45:39

3

由於維姆已經發現無論是CompsitionContainer也不CatalogExportProvider將調用Dispose目錄。他們都沒有創建目錄,因此他們都不擁有它,因此不會調用Dispose。構建目錄的人應該是處理它的人。

有很多情況下,有人會希望與多個容器共享一個目錄實例,這就是爲什麼容器不擁有catlaog的所有權,因此不處理它。

+0

所有的文檔都沒有強調這個 - 這個例子通常是'var container = new CompositionContainer(new SomeCatalog())'的形式。是否因爲沒有處置目錄沒有問題 - 沒有明顯的資源懸念? – Gishu 2011-04-21 02:47:17

+0

默認目錄僅具有可能需要處理的鎖,但最終會清除它們。一般情況下,這些示例假定您有一個應用程序容器,一旦完成該應用程序,應用程序就會關閉,無論如何,任何操作系統資源都會被清理乾淨。 – 2011-04-21 03:12:30