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介面給使用者使用。軟體本質就是封裝,對已有的實現進行封裝,暴露出更容易的介面。程式設計師本身是軟體開發者,也是軟體使用者,使用其他程式設計師提供的介面,別人提供的介面也可以認為是一個軟體。