MEF 程式設計指南(七) 使用目錄

2022-01-21 19:19:13 字數 1810 閱讀 1934

目錄(catalogs)

mef 特性程式設計模型的核心價值,擁有通過目錄動態地發現部件的能力。目錄允許應用程式輕鬆地使用那些通過 export attribute 註冊自身的匯出。下面列出 mef 提供的目錄。 

程式集目錄(assembly catalog)

為了發現給定程式集所有匯出,需要使用 [system.componentmodel.composition.hosting.assemblycatalog]。

var catalog = new assemblycatalog(assembly.getexecutingassembly());

檔案目錄(directory catalog)

為了發現目錄中所有程式集的所有匯出,需要使用 [system.componentmodel.composition.hosting.directorycatalog]。

var catalog = new directorycatalog("

extensions

");

directorycatalog 會一次性掃瞄目錄,但是在目錄有變動時候不會自動重新整理。然而,你可以實現自己的掃瞄機制,呼叫 catalog 的 refresh() 方法進行掃瞄。一旦重新掃瞄(rescans),重組(recomposition)就會發生。

var catalog = new directorycatalog("

extensions");

//實現掃瞄的邏輯

catalog.refresh();

注意:silverlight 不支援 

directorycatalog。 

聚集目錄(aggregate catalog)

當程式集目錄和檔案目錄不能獨自地滿足要求或者是需要合併目錄,需要使用 [system.componentmodel.composition.hosting.aggregatecatalog]。aggregatecatalog 組合多個目錄到單一的目錄。一種常見的模式是:不僅新增當前執行的程式集,而且新增三方擴充套件的檔案目錄。你可以傳遞 catalogs 集合到 aggregatecatalog 構造器,或者直接新增 catalogs 集合,例如:catalog.catalogs.add(...)

var catalog = new

aggregatecatalog(

newassemblycatalog(assembly.getexecutingassembly()),

new directorycatalog("

extensions

"));

型別目錄(type catalog)

為了發現特定型別集合的所有匯出,使用 [system.componentmodel.composition.hosting.typecatalog]。

var catalog = new typecatalog(typeof(type1), typeof(type2), ...);

發布目錄(deploymentcatalog) - 適用於 silverlight

為容器(container)使用目錄(catalog)

為容器使用目錄,簡單地把目錄傳遞給容器的構造器。

var catalog = new

assemblycatalog(assembly.getexecutingassembly());

var container = new compositioncontainer(catalog);

原文:

MEF 程式設計指南(八) 過濾目錄

var catalog new assemblycatalog typeof program assembly var parent new compositioncontainer catalog var filteredcat new filteredcatalog catalog,def de...

《MEF程式設計指南》博文彙總

在mef之前,人們已經提出了許多依賴注入框架來解決應用的擴充套件性問題,比如osgi 實現以spring 等等。在 microsoft 的平台上,net framework 自身內部包含元件模型和 system.addin。同時存在若干種開源解決方案,包括 sharpdevelop 的 soda 體...

MEF程式設計指南(前兩節)

mef程式設計指南 前兩節 在應用程式中使用mef 在應用程式中使用mef需要建立乙個compositioncontainer的例項,向其中新增可組合的部件,將宿主應用包含進去然後組合。以下是使用mef需要用到的步驟 1 建立乙個宿主類。在接下來的示例中,我們將會使用乙個控制台應用,所以宿主也就是p...