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

2021-05-22 14:53:47 字數 1920 閱讀 9997

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

在應用程式中使用mef

在應用程式中使用mef需要建立乙個compositioncontainer的例項,向其中新增可組合的部件,將宿主應用包含進去然後組合。

以下是使用mef需要用到的步驟:

1、建立乙個宿主類。在接下來的示例中,我們將會使用乙個控制台應用,所以宿主也就是program類了。

2、引用system.componentmodel.composition程式集

3、新增如下using語句:using system.componentmodel.composition;

4、新增乙個compose()方法,它建立容器的例項並做組合的工作

5、新增乙個run()方法,它會呼叫compose()方法

6、在main()方法中例項化宿主類

注意:在asp.net和wpf中無需這一步,因為宿主類是由執行時初始化的。

下面的**演示了**的樣式。

7、定義乙個或多個宿主可以匯入(import)的匯出(exports)。下面的**中我們將會建立乙個叫做imessagesender的介面。我麼還會定義乙個可組合元件--emailsender類,它通過使用[system.componentmodel.composition.export]特性來匯出了乙個imessagesender。

8、給宿主類新增屬性,每個屬性都被[system.componentmodel.composition.import]修飾。如下就是給program類新增的乙個imessegesender型別的匯入。

9、向容器中新增可組合部件。在mef中有多種方式可以向容器中新增可組合部件。其中一種就是直接新增可組合部件的例項,還有一種更常用的方式是通過使用目錄(catalog),我們稍後將會講解這一點。

向容器中直接新增元件

在compose()方法中通過使用composeparts()方法來手動新增可組合元件。下面的例子中,乙個emailsender的例項和需要匯入它的program類的例項被新增進了容器中去了。

使用assemblycatalog來向容器中新增可組合元件

通過使用catalog,容器可以自動建立元件的例項而不需要我們顯式的去新增它們。在compose()方法中建立乙個catalog。然後把它傳入到容器的構造方法中去。

下面的例子中,我們通過把當前程式集傳入其構造方法中去來建立了乙個assemblycatalog。我們沒有手動新增emailsender的例項,它將會被自動發現。

完成上面各個步驟之後,現在**應該是如下的樣式。

上面的**編譯並執行時,應用程式和它需要的匯入將會被組合起來。send()方法將會被呼叫,從而在控制台輸出「message sent」。

定義可組合部件和契約

可組合部件

可組合部件可以匯出其他部件需要的服務,也可以匯入其他部件提供的服務。在mef中可組合部件需要使用system.componentmodel.composition.import和system.componentmodel.composition.export來定義其匯入和匯出。乙個可組合部件應該至少包含乙個匯出。可組合部件可能會是被顯式的新增進容器中去,也可能是通過使用catalog被建立的。mef發布時帶有的預設catalog可以通過export特性來識別可組合部件。

契約可組合部件並非是直接依賴於彼此,它們都依賴於乙個契約,也就是乙個標示字串。每個匯出都會有乙個契約,而匯入需要宣告它需要哪個契約。容器通過使用契約資訊來匹配匯入和匯出。如果沒有指明契約,mef將會預設使用型別的全限定名作為契約。如果匯出中傳入了乙個型別,mef也將會使用全限定名。

下面的**中出現的所有匯出契約都是等價的。

介面/抽象契約

通常乙個可組合部件匯出的都是介面或者抽象型別,而不是具體型別。比如如下的**中,有兩個類都匯出了imessagesender。notifier類匯入一組imessagesender,並呼叫其中每一項的send()方法。現在新的資訊傳送器可以很容易的被新增到系統中去。

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

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

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

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

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

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