MEF的全稱是Managed Extensibility Framework(MEF),其是.net4.0的組成部分,在3.5上也可以使用。熟悉java中的spring框架的人,對這個框架中涉及的幾個概念應該會比較容易理解。
這裡我先把我兩年多前的一個完整的利用MEF搭建的插件式系統中涉及到的MEF框架裡的幾個基本概念大致描述下。
MEF框架中提供 import和export功能,即注入和導出。Spring中有依賴注入這個概念,這裡的這個概念也是大同小異,即將某個對象實例化後,注入到依賴這個實例的對象中,如此可以降低類之間的耦合。同樣,與spring中的注入類似,MEF也有延遲注入這個概念,普通的依賴注入在整個程序開始運行時便進行了注入,而這種延遲注入可以做到只有當對象需要被使用時才進行注入。
約定是與依賴注入相輔相成的。依賴注入最大的好處就是類與類之間解耦,但是如何知道到底是將一個類注入到另外一個類中呢,這裡就需要約定這個概念了。既需要注入的類並不用直接引用對方的類,而是兩者通過一個共同的接口(也可以是類等其他),此接口即為約定,從而進行導出和注入。
我們用spring時,針對不同的應用,我們只需要啟動applicationContext或者WebApplicationContext將配置加載到IOC容器中,根據XML配置或者注記便可以實現類的依賴注入。在MEF框架中,這種IOC容器需要代碼來進行實現,並且配置一般通過注記的方式。
這裡涉及到兩個概念,分別是catalog和compositionContainer。catalog中將所有需要組裝到IOC容器中的類集中到一起,然後再將catalog放入到componentContainer中,這樣我們的IOC容器便擁有了所有的需要進行控制的類。但是僅僅放入後,也並不能讓容器進行自動的依賴注入,它還需要我們進行ComposeExportedValue和SatisfyImportsOnce這樣的操作,才能真正的完成依賴注入的全過程。