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

2022-01-21 19:19:13 字數 2131 閱讀 4185

var catalog = new assemblycatalog(typeof

(program).assembly);

var parent = new

compositioncontainer(catalog);

var filteredcat = new

filteredcatalog(catalog,

def => def.metadata.containskey(compositionconstants.partcreationpolicymetadataname) &&((creationpolicy)def.metadata[compositionconstants.partcreationpolicymetadataname]) ==creationpolicy.nonshared);

var child = new

compositioncontainer(filteredcat, parent);

var root = child.getexportedobject();

child.dispose();

如果 creationpolicy 作為標準選擇部件不能滿足需求,你可能想到使用 [system.componentmodel.composition.partmetadataattribute] 替代。它允許為部件附加元資料,因此可以使用它構建過濾表示式。下面的示例就是 partmetadata 特性的應用:

[partmetadata("

scope

", "

webrequest

"), export]

public

class

homecontroller : controller

這允許你建立侷限於 web 請求(邏輯)部件的子容器。請注意:範圍邊界取決於你的定義,換句話說,mef 不知道 "webrequest"是什麼,所以你不得不建立一些基礎**來在每次web 請求時建立/**(create/dispose)容器。

var catalog = new assemblycatalog(typeof

(program).assembly);

var parent = new

compositioncontainer(catalog);

var filteredcat = new

filteredcatalog(catalog,

def => def.metadata.containskey("

scope

") &&def.metadata[

"scope

"].tostring() == "

webrequest");

var perrequest = new

compositioncontainer(filteredcat, parent);

var controller = perrequest.getexportedobject();

perrequest.dispose();

注意:我們並沒有提供 filteredcatalog 類。下面演示了如何構建乙個簡單的實現。

using

system;

using

system.componentmodel.composition.primitives;

using

system.componentmodel.composition.hosting;

using

system.linq;

using

system.linq.expressions;

public

class

filteredcatalog : composablepartcatalog, inotifycomposablepartcatalogchanged

public

override iqueryableparts

}public

event eventhandlerchanged

remove

}public

event eventhandlerchanging

remove

}}

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

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

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

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

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

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