通過前面兩篇文章的介紹,相信各位會明白MEF中有不少實用價值。上一文中我們也討論了導入與導出,對於導出導入,今天我們再深入一點點,嗯,只是深入一點點而已,不會很難的,請大家務必放心,如果大家覺得看文章枯燥,不妨一邊喝牛奶一邊閱讀。
上一文中我們都是把整個類型(整個類)進行導出,不過有時候,我們可能會考慮只導出類的某些成員,比如某個屬性或某個字段等。
我們還是少說理論,免得大家喝不下牛奶,還是直接上菜吧。為了便於測試,以下示例把組件都寫在當前程序集中,也就是在同一個項目,然後用AssemblyCatalog來查找。
首先,定義一個公共接口IWork。
然後分別用兩個類來實現該接口。
接著,我們再定義一個總類,包含兩個屬性,分別返回FirstWork類和SecondWork類的實例。
ExportAttribute特性只附加在WorkFirst和WorkSecond兩個屬性上,Works類只導出這兩個屬性。
隨後,我們組裝並調用這些導出部件。
然後我們運行一下示例,就可以得到如下圖所示的結果:
很多人學習編程很喜歡直接Ctrl + C別人的代碼,這是一種相當不好的學習方法,所以我把代碼都弄成截圖了,哈哈。
我事前在導入字段聲明時用了Lazy<T>,但發現不能創建對象,可能的原因是我們導出的是類的一部分,內部運行時在組裝部件時需要Works類進行實例化,因為如果Works對象不實例化的話,就導不出WorkFirst和WorkSecond屬性了。也許是這個原因導致的吧。
這時候大家可能會想,如果我在Works類中定義一個方法,我想導出這個方法怎麼辦?
既然想到了還等什麼,馬上試試就知道了,我們把Works類的代碼改一下,導出一個ViewWork方法。
協定類型為什麼使用Func<TResult>呢
導入的協定名與協定類型一定要與導出匹配,否則無法導入。這就好比你的言行要匹配一樣,否則妹子不會理你。
在完成組裝的代碼後面,我們測試調用導入的方法。
然後運行一下,看看有沒有結果。
不過,最後,還是把完整的代碼貼一下。