[VS2010 Online]Managed Extensibility Framework in Visual Studio 2010 -- (1)
Managed Extensibility Framework(MEF)是 .NET 4.0平台下的一個可擴充式的 Framework,
可以用來協助建立可擴充式、容易維護的應用程式、函式庫以及Custom Framework。
就像積木堆疊般,透過 MEF,開發人員可輕鬆地在擴展點上彈性堆砌其應用程式以及框架。
MEF的核心概念主要可以分為五個部分:
Composable part:提供服務給其他組件(part)使用或是操作其他組件提供的服務。
Export:指的是組件提供的服務。組件透過定義export來提供服務,單一組件可以提供多個服務。
Import:指的是組件所使用的服務,組件定義import來使用此服務,單一個組件可以提供一或多個服務。
Contracts:用來識別Export以及Import,Export用它來定義它所提供的服務,
Import則用它定義它所要使用的服務。
Composition:Composable part的組合,具現化後會去mapping import跟export。
我們先來看ㄧ段簡單的程式:
當你寫完了這段程式碼後,正準備收拾書包回家去,
親愛的 User 突然出現,然後一臉抱歉的跟你說:「對不起,這一段我老闆要的是 Hello Kitty」。
你這時為了避免這個親愛的 User 再度的修改程式,勢必要作一些彈性的變更,
對於 MEF 來說,這就是一個該擴展的點。
我們利用 MEF 的優點來針對這個 scenario 作一些調整:
1.
首先,我們加入 System.ComponentModel.Composition.dll 參考。
2.
建立一個 Import (名稱為 MyOptions)來定義要回傳的字串物件:
2.
接下來定義 Export (名稱為 MyOptions)所提供的服務,這裡會回傳 "Kitty" 字串。
3.
在 CompositionContainer 中去註冊 Composable part,讓 Composition
能夠對配對 Import 以及 Export。
4.
結果:
5.
你也可以透過型別去宣告 Import 以及 Export
結果會跟以名稱宣告一樣。
這裡還有一個地方不具有彈性,不知道你發現了沒?
就是如果每次要修改程式碼時,就要去 CompositionContainer 重新註冊組件,
這樣的作法實在很不具有彈性。
因此 MEF 提供一種 Catalog 機制,可以彈性地擴展組件。
種類 | 敘述 |
TypeCatalog | 以型別的方式在目錄中註冊,當 CompositionContainer 搜尋組件時,就會依照型別來找。 |
AssemblyCatalog | 註冊一個 Assembly,然後在Assembly中去尋找組件。 |
DirectoryCatalog | 註冊一個特定的目錄,讓 CompositionContainer 去其中尋找符合自行定義的規則(search pattern)的物件中的組件。 |
AggregateCatalog | 可以在其中增刪 Catalog,可以說是上述 Catalog 的集合。 |
如何宣告可以看這裡:
這樣一來,整個程式就變的非常有彈性。只要在 CompositionContainer
註冊 AssemblyCatalog,當程式需要變更時,就根據 Catalog 的內容處理,
就不會動到這部分的程式碼。
我們再來試看看,在下列情況時,會發生什麼事?
在這段程式碼中,有兩個同名的 Export ,當組件要去叫用服務時,
這裡就會產生這樣的問題:
在 CompositionContainer 作 Import 以及 Export 配對時,就跳出一個這樣的錯。
提醒 Coder 在程式碼中 Export 有兩個,跟 Import 配對上會有問題。
我們可以利用剛剛提到的宣告型別方式調整:
結果:
MEF 是不是很具有彈性呢? 筆者未來會在介紹一些更進階的作法。
試煉大會,我們下次見。
參考連結:
http://msdn.microsoft.com/en-us/magazine/ee291628.aspx
如果您有微軟技術開發的問題,可以到MSDN Forum發問。
如果您有微軟IT管理的問題,可以到TechNet Forum發問喔。