当前位置:首页 > Windows程序 > 正文

MEF实现设计上的“松耦合”(一)

2021-03-26 Windows程序

前言:最近去了趟外地出差,介绍推广小组开发的框架类产品。推广对象是本部门在项目上面的同事——1到2年工作经验的初级程序员。在给他们介绍框架时发现很多框架设计层面的知识他们都没有接触过,甚至没听说过,这下囧了~~于是乎在想该如何跟他们解释MEF、AOP、仓储模式等方面的东东。本来 C#基础系列 应该还有两篇关于异步的没有写完,奈何现在要推广这些个东西,博主打算先介绍下项目中目前用到的些技术,,异步的往后有时间再做分享。C#进阶系列主要围绕MEF、AOP、仓储模式、Automapper、WCF等展开。本篇先来介绍下MEF的基础知识。

1、什么是MEF

先来看msdn上面的解释:MEF(Managed Extensibility Framework)是一个用于创建可扩展的轻型应用程序的库。 应用程序开发人员可利用该库发现并使用扩展,而无需进行配置。 扩展开发人员还可以利用该库轻松地封装代码,避免生成脆弱的硬依赖项。 通过 MEF,不仅可以在应用程序内重用扩展,还可以在应用程序之间重用扩展。

也有人把MEF解释为“依赖注入”的一种方式,那么什么是“依赖注入”?如果这样解释,感觉越陷越深......根据博主的理解,了解MEF只需要抓住以下几个关键点:

(1)字面意思,可扩展的framework,或者叫可扩展的库。也就是说,使用MEF是为了提高程序的可扩展性。MEF会根据指定的导入导出自动去发现匹配的扩展,不需要进行复杂的程序配置。

(2)在设计层面上来说,为什么要使用MEF?为了“松耦合”!我们知道,程序设计有几个原则,“高内聚,低耦合”就是其中一个。使用MEF可以帮助我们减少内库之间的耦合。

当然,如果你之前压根都没有听说过MEF,那么即使看了我上面的解释,估计也还是云里雾里。没关系,如果此刻你还有兴趣,看了下面的Demo,相信你会有一个初步的认识。

2、为什么要使用MEF:上面已经解释过,为了程序的扩展和“松耦合”。

3、MEF的使用:

(1)MEF基础导入导出的使用:

MEF的使用步骤主要分三步:宿主MEF并组合部件、标记对象的导出、对象的导入使用。

我们先来看一个Demo。

 class Program2 {
     //导入对象使用 [Import(
"chinese_hello")] public Person oPerson { set; get; } static void Main(string[] args) { var oProgram = new Program2(); oProgram.MyComposePart(); var strRes = oProgram.oPerson.SayHello("李磊"); Console.WriteLine(strRes); Console.Read(); }
     //宿主MEF并组合部件
void MyComposePart() { var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); var container = new CompositionContainer(catalog); //将部件(part)和宿主程序添加到组合容器 container.ComposeParts(this); } }   public interface Person { string SayHello(string name); }
   //声明对象可以导出 [Export(
"chinese_hello", typeof(Person))] public class Chinese : Person { public string SayHello(string name) { return "你好:" + name ; } } [Export("american_hello", typeof(Person))] public class American : Person { public string SayHello(string name) { return "Hello:" + name ; } }

得到结果:

我们来分析下这段代码:

     //宿主MEF并组合部件 void MyComposePart() { var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); var container = new CompositionContainer(catalog); //将部件(part)和宿主程序添加到组合容器 container.ComposeParts(this); }

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/67895.html