理解 MEF

Andy Niu發表於2014-01-14

1、它解決什麼問題?

  考慮下面的需求,甲程式設計師對外暴露介面,內部提供實現。乙程式設計師使用甲提供的介面,根據面向介面程式設計的原則,乙關聯一個介面型別的引用。正常情況下,乙要使用甲的實現,必須例項化一個具體物件。有沒有更好的辦法呢?我們知道Java框架spring中有個依賴注入的概念。C#中能不能使用類似的方式呢?

2、怎麼解決?

  使用MEF(Managed Extensibility Framework),示例如下:

 1 namespace TestMEF
 2 {
 3     public interface IBookService
 4     {
 5         void GetBookName();
 6     }
 7 
 8     [Export(typeof(IBookService))]
 9     public class ComputerBookService : IBookService
10     {
11         public void GetBookName()
12         {
13             Console.WriteLine("Computer Book");
14         }
15     }
16 
17     [Export(typeof(IBookService))]
18     public class EnglishBookService : IBookService
19     {
20         public void GetBookName()
21         {
22             Console.WriteLine("English Book");
23         }
24     }
25 
26     class Program
27     {
28         //[Import]
29         //public IBookService Service { get; set; }
30 
31         [ImportMany]
32         public List<IBookService> ServiceList { get; set; }
33  
34         private void Compose()
35         {
36             var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
37             var container = new CompositionContainer(catalog);
38             container.ComposeParts(this);
39         }
40 
41         static void Main(string[] args)
42         {
43             Program p = new Program();
44             p.Compose();
45 
46             //p.Service.GetBookName();
47 
48             foreach (IBookService service in p.ServiceList)
49             {
50                 service.GetBookName();
51             }         
52 
53             Console.ReadLine();
54         }
55     }
56 }

說明:有一個實現,使用者那裡期望public IBookService Service,有多個實現,使用者期望public List<IBookService> ServiceList 。

3、通過這個示例,更加深刻理解。軟體的本質就是封裝,作業系統封裝硬體,高階程式語言封裝作業系統,應用軟體封裝高階語言,應用軟體暴露UI介面給使用者使用。軟體本質就是封裝,對已有的實現進行封裝,暴露出更容易的介面。程式設計師本身是軟體開發者,也是軟體使用者,使用其他程式設計師提供的介面,別人提供的介面也可以認為是一個軟體。

相關文章