本文主要說明在Modern UI框架下使用MEF的必要步驟,關於MEF請自行腦補。
MEF-INTO-MUI例項程式碼下載: MefMuiApp.zip
1:建立一個匯出屬性
ModernFrame用來承載在MUI應用中顯示的內容。內容是通過URI標識的,我們需要通過MEF來標記一段內容是被匯出的,同時提供一個可供訪問的URI標識,這可以通過後設資料實現。
下面的ContentAttribute類繼承自ExportAttribute,並新增了一個CotentUrl後設資料屬性,契約規定可匯出的內容必須繼承IContent介面。
為了能在MEF中使用強型別後設資料,我們也定義了一個IContentMetadata介面,在後面將會用到
2:匯出內容
下一步我們需要做的就是使用ContentAttribute來標記可被匯出的內容頁面,並且每一個頁面都必須繼承IContent介面。
下面的程式碼演示了將可被匯出的MyPage指定URI為"/MyPage"。
3:繼承contentLoader
我們現在需要定義一個IContentLoader的實現,能夠接收匯出的內容,並根據內容的URI返回介面。為此我們建立新的從DefaultContentLoader派生的MEFContentLoader,這個載入器可以匯入包含了IContentMetadata和繼承了IContent介面的匯出內容,這樣我們就可以通過URI訪問了。
當通過LoadContent方法請求時,請求的uri會和後設資料進行匹配,成功後內容就會被返回。Content例項通過Lazy進行延遲載入。
請注意MefContentLoader本身也有出口。
4:把他們放在一起
所有必須的元素已經準備就緒,我們現在要做的就是確保所有的Modern控制元件使用新的MefContentLoader而不是預設的contentLoader,在App.xaml中新增下面的預設樣式。動態資源的引用問題將在後面解決。
MEF在應用啟動時進行組合,將下面的程式碼新增到應用啟動方法中(App.xaml.cs的OnStartup方法)
MEF組合需要建立的程式集目錄並將其填充到CompositionContainer容器中,從容器中檢索MefContentLoader例項並將其新增到全域性應用程式資源字典中,一旦這個載入器被載入,在預設樣式中使用動態資源的問題就被解決了。
就是如此。每當ModernFrame需要載入內容時,它就用在預設樣式中定義的MefContentLoader,MefContentLoader根據ContentUri在匯出的後設資料中進行查詢。