添加一个IBookService接口

时间:2021-12-29 08:12:18

在文章开始之前,首先简单介绍一下什么是MEF,,MEF,全称Managed Extensibility Framework(托管可扩展框架)。单从名字我们不难发明:MEF是专门致力于解决扩展性问题的框架,MSDN中对MEF有这样一段说明:

  Managed Extensibility Framework 或 MEF 是一个用于创建可扩展的轻型应用措施的库。 应用措施开发人员可操作该库发明并使用扩展,而无需进行配置。 扩展开发人员还可以操作该库轻松地封装代码,制止生成脆弱的硬依赖项。 通过 MEF,不只可以在应用措施内重用扩展,还可以在应用措施之间重用扩展。

  空话不久不多说了,想了解更多关于MEF的内容,到百度上面查吧!

  MEF的使用范畴广泛,在Winform、WPF、Win32、Silverlight中都可以使用,我们就从控制台说起,看看控制台下如何实现MEF,下面先新建一个win32控制台项目MEFDemo,添加一个IBookService接口,写一个简单的Demo:

添加一个IBookService接口

IBookService内容如下:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MEFDemo { public interface IBookService { string BookName { get; set; } string GetBookName(); } }

下面添加对System.ComponentModel.Composition定名空间的引用,由于在控制台措施中没有引用这个DLL,所以要手动添加:

添加一个IBookService接口

点击OK,完成添加引用,新建一个Class,如:MusicBook担任IBookService接口,代码如下:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel.Composition; namespace MEFDemo { [Export(typeof(IBookService))] public class MusicBook : IBookService { public string BookName { get; set; } public string GetBookName() { return "MusicBook"; } } }

Export(typeof(IBookService)) 这句话将类声明导出为IBookService接口类型。

然后改削Porgram中的代码如下:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; namespace MEFDemo { 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() { var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); CompositionContainer container = new CompositionContainer(catalog); container.ComposeParts(this); } } }

这里使用[Import]导入刚刚导出的MusicBook,下面的Compose要领,实例化CompositionContainer来实现组合,点击F5运行,功效如下:

添加一个IBookService接口

可以看到挪用了MusicBook类的GetBookName要领,但是我们并没有实例化MusicBook类,是不是很神奇呢???

这一就是实现了主措施和类之间的解耦,大大提高了代码的扩展性和易维护性!