菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
327
0

理解 MEF

原创
05/13 14:22
阅读数 17393

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接口给用户使用。软件本质就是封装,对已有的实现进行封装,暴露出更容易的接口。程序员本身是软件开发者,也是软件使用者,使用其他程序员提供的接口,别人提供的接口也可以认为是一个软件。

发表评论

0/200
327 点赞
0 评论
收藏