[VS2010 Online]Managed Extensibility Framework in Visual Studio 2010 -- (1)

[VS2010 Online]Managed Extensibility Framework in Visual Studio 2010 -- (1)

image

 

 

Managed Extensibility Framework(MEF)是 .NET 4.0平台下的一個可擴充式的 Framework,

可以用來協助建立可擴充式、容易維護的應用程式、函式庫以及Custom Framework。

 

 

就像積木堆疊般,透過 MEF,開發人員可輕鬆地在擴展點上彈性堆砌其應用程式以及框架。

 

image

 

 

MEF的核心概念主要可以分為五個部分:

image

 

Composable part:提供服務給其他組件(part)使用或是操作其他組件提供的服務。

Export:指的是組件提供的服務。組件透過定義export來提供服務,單一組件可以提供多個服務。

Import:指的是組件所使用的服務,組件定義import來使用此服務,單一個組件可以提供一或多個服務。

Contracts:用來識別Export以及Import,Export用它來定義它所提供的服務,

           Import則用它定義它所要使用的服務。

CompositionComposable part的組合,具現化後會去mapping import跟export。

 

 

 

我們先來看ㄧ段簡單的程式:

image

 

 

當你寫完了這段程式碼後,正準備收拾書包回家去,

親愛的 User 突然出現,然後一臉抱歉的跟你說:「對不起,這一段我老闆要的是 Hello Kitty」。

你這時為了避免這個親愛的 User 再度的修改程式,勢必要作一些彈性的變更,

對於 MEF 來說,這就是一個該擴展的點。

 

 

 

我們利用 MEF 的優點來針對這個 scenario 作一些調整:

1.

首先,我們加入 System.ComponentModel.Composition.dll 參考。

 

2.

建立一個 Import (名稱為 MyOptions)來定義要回傳的字串物件:

image

 

 

2.

接下來定義 Export (名稱為 MyOptions)所提供的服務,這裡會回傳 "Kitty" 字串。

image

 

3.

CompositionContainer 中去註冊 Composable partComposition

能夠對配對 Import 以及 Export。

image

 

4.

結果:

image

 

 

5.

你也可以透過型別去宣告 Import 以及 Export

image

 

image

 

結果會跟以名稱宣告一樣。

 

 

 

這裡還有一個地方不具有彈性,不知道你發現了沒?

就是如果每次要修改程式碼時,就要去 CompositionContainer 重新註冊組件,

這樣的作法實在很不具有彈性。

 

因此 MEF 提供一種 Catalog 機制,可以彈性地擴展組件。

    種類

敘述

TypeCatalog以型別的方式在目錄中註冊,當 CompositionContainer 搜尋組件時,就會依照型別來找。
AssemblyCatalog註冊一個 Assembly,然後在Assembly中去尋找組件。
DirectoryCatalog註冊一個特定的目錄,讓 CompositionContainer 去其中尋找符合自行定義的規則(search pattern)的物件中的組件。
AggregateCatalog可以在其中增刪 Catalog,可以說是上述 Catalog 的集合。

 

 

如何宣告可以看這裡:

image

 

 

 

這樣一來,整個程式就變的非常有彈性。只要在 CompositionContainer

註冊 AssemblyCatalog,當程式需要變更時,就根據 Catalog 的內容處理,

就不會動到這部分的程式碼。

 

image

 

 

 

我們再來試看看,在下列情況時,會發生什麼事?

image

 

 

在這段程式碼中,有兩個同名的 Export ,當組件要去叫用服務時,

這裡就會產生這樣的問題:

image

 

在 CompositionContainer 作 Import 以及 Export 配對時,就跳出一個這樣的錯。

提醒 Coder 在程式碼中 Export 有兩個,跟 Import 配對上會有問題。

 

 

我們可以利用剛剛提到的宣告型別方式調整:

image

 

 

結果:

image

 

 

 

MEF 是不是很具有彈性呢? 筆者未來會在介紹一些更進階的作法。

 

 

試煉大會,我們下次見。

 

 

 

 

參考連結:

http://www.codeplex.com/MEF

http://msdn.microsoft.com/en-us/magazine/ee291628.aspx

 

 

 

如果您有微軟技術開發的問題,可以到MSDN Forum發問。

如果您有微軟IT管理的問題,可以到TechNet Forum發問喔。