前言
小编菜鸟级别的程序员最近感慨颇多,经历了三五春秋深知程序路途遥远而我沧海一粟看不到的尽头到不了的终点何处是我停留的驿站。说了段废话下面进入正题吧!
什么是MEF?
MEF:全称Managed Extensibility Framework(托管可扩展框架)。单从名字我们不难发现MEF是专门致力于解决扩展性问题的框架。
MSDN:MEF(Managed Extensibility Framework)是一个用于创建可扩展的轻型应用程序的库。 应用程序开发人员可利用该库发现并使用扩展,而无需进行配置。 扩展开发人员还可以利用该库轻松地封装代码,避免生成脆弱的硬依赖项。 通过 MEF,不仅可以在应用程序内重用扩展,还可以在应用程序之间重用扩展。
也有人把MEF解释为“依赖注入”的一种方式,那么什么是“依赖注入”?
其实依赖注入就是我们日常所说的IOC/DI也就是IOC控制反转,DI依赖注入这俩是一个概念不同的角度理解的意思,当然了IOC被称为是一种思想并不是技术的实现而本章讲解的MEF属于IOC的一种大家可以吧IOC看作为一种编程“语言” 在编程语言中有很多的种类例如:C#,JAVA,C++等等。MEF就属于IOC中的一种,还有很多其他的实现方式大家可以自行百度去找相关素材。
了解MEF只需要抓住以下几个关键点:
(1)字面意思,可扩展的framework,或者叫可扩展的库。也就是说,使用MEF是为了提高程序的可扩展性。MEF会根据指定的导入导出自动去发现匹配的扩展,不需要进行复杂的程序配置。
(2)在设计层面上来说,为什么要使用MEF?为了“松耦合”!我们知道,程序设计有几个原则,“高内聚,低耦合”就是其中一个。使用MEF可以帮助我们减少内库之间的耦合。
MEF用法
(1)MEF基础导入导出的使用: MEF的使用步骤主要分三步:宿主MEF并组合部件、标记对象的导出、对象的导入使用。
IBookService内容如下:
public interface IBookService { string BookName { get; set; } string GetBookName(); }
建立MusicBook继承自IBookService
[Export(typeof(IBookService))] public class MusicBook : IBookService { public string BookName { get; set; } public string GetBookName() { return "jhtBOOK"; } }
建立测试类使用[Import]导入刚刚导出的MusicBook,下面的Compose方法,实例化CompositionContainer来实现组合,需引用:
class Program { [Import] public IBookService Service { get; set; } static void Main(string[] args) { Program pro = new Program(); pro.Compose(); if (pro.Service != null) { Console.WriteLine(pro.Service.GetBookName()); } Console.Read(); } private void Compose() { //宿主MEF并组合部件 var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); CompositionContainer container = new CompositionContainer(catalog); //将部件(part)和宿主程序添加到组合容器 container.ComposeParts(this); } }
测试结果展现:
Composr:这个方法表示把当前Program这个类添加到组合容器,为什么要添加到组合容器?是因为只要添加到组合容器中之后,如果该类里面有Import,MEF才会自动去寻找对应的Export。这也就是为什么使用MEF前必须要组合部件的原因。大家也就可以吧IOC容器理解为一个键值对存在的集合初始化之后需要用到的对象自动到IOC容器中去寻找。