天天看點

【.NET 深呼吸】在 .net core app 中使用 Composition

.NET 中的 Composition ,即 MEF。MEF 說得簡單一點,就是它可以在運作階段動态地發現類型,用于元件擴充方面特别合适。

.NET Core App 的預設架構并不提供 MEF 有關的 API,但,别忘了 Nuget,那上面有相關的庫,而且是官方釋出的,不出意外的話,是能用的,而且老周也親自測過,嚴重證明是可用的。

哦,是了,順便提一下,如果你弄的是 ASP.NET Core 項目,對于元件擴充,你可以不必考慮用 Composition,因為 ASP.NET Core 有強大的依賴注入功能,是以,通過注入,也能做到動态發現元件的效果,而且內建性更好。

是以,是以嘛,咱們今天說的 Composition 主要是針對 .net core app,預設模闆提供的是控制台應用程式,或者類庫。當然了,也可能是其他類型的項目,而且開源項目将來也會多起來。

好了,上面說的都是閑話,咱們開始講正話。

首先,你要先建一個 core 的項目,嗯,就選控制台應用吧。

建好項目之後,打開項目的 Nuget 管理器,搜尋:

注意,别搜錯了,因為 System.Composition 是挺多的,能搜出一打來,但是,你要細看,System.ComponentModel.Composition 支援 Core。請注視下面這張高清無碼截圖。

【.NET 深呼吸】在 .net core app 中使用 Composition

現在你明白為啥要選這個了,至于說 System.Composition 是否支援在 .net core app 中使用,這個就不知道了,沒試,你有空的話可以試試,但上面沒有注明支援 core。

然後安裝 System.ComponentModel.Composition 包,安裝到項目後,就能用了。來,趕緊試試。

引入以下這兩個命名空間:

定義一個接口,作為擴充元件的共同協定。

它表示某電影院正在上映的電影。

下面兩家影院(元件)近期比較熱門。

其實這樣定義的元件,在運作時還是不能被發現的,我們得讓它們導出。方法是……自己看下面代碼。

導出限制有這麼幾種:

* 限制類型,這一般是元件的約定接口,就是元件實作的共同接口,比如上面的 IMovie。

* 限制名,這個嘛,自己賜給它一個名字即可。

* 混合,就是限制名 + 限制類型。這種方法最為準确,在導入時可以準确找到元件。

如果 ExportAttribute 應用的目标是元件類,而不是接口類型,這時你至少得手動指定一個限制類型,設定為 IMovie,不然,它預設就是目标類的名字,這樣一來,這兩個元件就無法保有共同的限制,導入時不容易找出來。

我為了示範友善,我這些元件的定義與使用都是在同一個程式集中,是以,元件查找範圍在目前程式集中。

用上面準備好的 Catalog 去初始化 CompositionContainer ,通過容器去擷取發現的元件執行個體。

GetExportedValues 方法能直接得到所有發現的元件的執行個體,如果不想馬上用到元件執行個體,可以擷取 Lazy 包裝的對象,延時初始化,方法是調用 GetExports 或者 GetExport 方法。

得到所有元件執行個體後,可以嘗試調用一下。

程式運作後,就會輸出以下内容。

【.NET 深呼吸】在 .net core app 中使用 Composition

看,兩個元件都被成功調用了。

========================================================================

 最近腦細胞不夠用,是以部落格寫得少了,老周在此表示歉意。等過一段時間,腦細胞複活了,老周有空就多寫些簡單實用的博文。複雜而不實用的東西老周不太會寫,唉,沒法了,畢竟老周的水準也比較菜,沒見過大世面,沒做過大項目,沒調過大 bug。最大的項目也就是 1213 個實體類,200 多個存儲過程,900 多個表,120 個視圖。這種規模,估計是老周這一生做過的最大的項目了。

繼續閱讀