理解 MEF

1、它解决什么问题?

  考虑下面的需求,甲程序员对外暴露接口,内部提供实现。乙程序员使用甲提供的接口,根据面向接口编程的原则,乙关联一个接口类型的引用。正常情况下,乙要使用甲的实现,必须实例化一个具体对象。有没有更好的办法呢?我们知道Java框架spring中有个依赖注入的概念。C#中能不能使用类似的方式呢?

2、怎么解决?

  使用MEF(Managed Extensibility Framework),示例如下:

 namespace TestMEF
{
public interface IBookService
{
void GetBookName();
} [Export(typeof(IBookService))]
public class ComputerBookService : IBookService
{
public void GetBookName()
{
Console.WriteLine("Computer Book");
}
} [Export(typeof(IBookService))]
public class EnglishBookService : IBookService
{
public void GetBookName()
{
Console.WriteLine("English Book");
}
} class Program
{
//[Import]
//public IBookService Service { get; set; } [ImportMany]
public List<IBookService> ServiceList { get; set; } private void Compose()
{
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
} static void Main(string[] args)
{
Program p = new Program();
p.Compose(); //p.Service.GetBookName(); foreach (IBookService service in p.ServiceList)
{
service.GetBookName();
} Console.ReadLine();
}
}
}

说明:有一个实现,使用者那里期望public IBookService Service,有多个实现,使用者期望public List<IBookService> ServiceList 。

3、通过这个示例,更加深刻理解。软件的本质就是封装,操作系统封装硬件,高级编程语言封装操作系统,应用软件封装高级语言,应用软件暴露UI接口给用户使用。软件本质就是封装,对已有的实现进行封装,暴露出更容易的接口。程序员本身是软件开发者,也是软件使用者,使用其他程序员提供的接口,别人提供的接口也可以认为是一个软件。

上一篇:原生js实现tab选项卡里内嵌图片滚动特效代码


下一篇:Django 数据库查询集合(多对多)