博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
理解 MEF
阅读量:7117 次
发布时间:2019-06-28

本文共 1833 字,大约阅读时间需要 6 分钟。

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 : IBookService10     {11         public void GetBookName()12         {13             Console.WriteLine("Computer Book");14         }15     }16 17     [Export(typeof(IBookService))]18     public class EnglishBookService : IBookService19     {20         public void GetBookName()21         {22             Console.WriteLine("English Book");23         }24     }25 26     class Program27     {28         //[Import]29         //public IBookService Service { get; set; }30 31         [ImportMany]32         public List
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接口给用户使用。软件本质就是封装,对已有的实现进行封装,暴露出更容易的接口。程序员本身是软件开发者,也是软件使用者,使用其他程序员提供的接口,别人提供的接口也可以认为是一个软件。

转载地址:http://jqfel.baihongyu.com/

你可能感兴趣的文章
优化体系结构 - 算法外置优化计算结构
查看>>
jqGrid的rowNum属性默认值、-1情况的介绍
查看>>
你应该知道的数据库数据类型及其设计原则
查看>>
解决vue报错Failed to mount component
查看>>
[LeetCode] 124. Binary Tree Maximum Path Sum
查看>>
活学活用! 用Local Storage实现多人聊天室
查看>>
一次爬虫实践记录
查看>>
炫酷粒子表白,双十一脱单靠它了!
查看>>
mysql锁以及实践总结
查看>>
【工具】MongoDB 与可视化工具 adminMongo 的安装、启动与连接
查看>>
Javascript--常用方法
查看>>
Swoft之服务注册发现Consul服务器配置
查看>>
[译]迁移到新的 React Context Api
查看>>
IM 推送保障及网络优化详解(二):如何做长连接加推送组合方案
查看>>
webpack4 踩坑记
查看>>
线程池你真不来了解一下吗?
查看>>
【跃迁之路】【424天】程序员高效学习方法论探索系列(实验阶段181-2018.04.05)...
查看>>
火狐放不了html5 video MP4格式
查看>>
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器...
查看>>
通过提交信息来关闭issue
查看>>