- 基本概念:
- Managed Extensibility Framework 或 MEF 是一个用于创建可扩展的轻型应用程序的库,在.NET 4.0发布
- Container:容器,使用CompositionContainer类表示,存放目录(Catalog)并进行管理,如导入,导出
- Catalog:目录,存放部件的地方,当需要某个部件时会在目录中寻找,可以作为目录的有type,assembly,directory
- Part:部件,即实现契约的类
- Import:导入,使用ImportAttribute进行修饰,可将某个对象声明为Import,可以修饰field,property,parameter等。每个导入都有一个契约,用于匹配对应的导出
- Export:导出,导出契约的实现,对应一个Import
- Contract:契约,一种约定,代码中表现为接口或者抽象类
- 示意图:
- 示例代码:
//这便是我们的契约 Contract public interface ICalculator { int Add(int a, int b); int Sub(int a, int b); } //此处我们导出了契约,这就是一个部件 [Export(typeof(ICalculator))] public class MyCalculator : ICalculator { public int Add(int a, int b) { Console.WriteLine("Add Invoked"); return a + b; } public int Sub(int a, int b) { Console.WriteLine("Sub Invoked"); return a - b; } } //此处我们导出了契约,这就是一个部件 [Export(typeof(ICalculator))] public class MyCalculator : ICalculator { public int Add(int a, int b) { Console.WriteLine("Add Invoked"); return a + b; } public int Sub(int a, int b) { Console.WriteLine("Sub Invoked"); return a - b; } } class Program { private static CompositionContainer _container; static void Main(string[] args) { //AssemblyCatalog 目录的一种,表示在相应的程序集中搜索 var catalog = new AssemblyCatalog(typeof(Program).Assembly); _container = new CompositionContainer(catalog); MathCompute mathCompute = new MathCompute(); _container.ComposeParts(mathCompute);//组装部件 Console.WriteLine(mathCompute.Add(1, 3)); Console.WriteLine(mathCompute.Sub(3, 2)); Console.ReadLine(); } }
时间: 2024-10-29 04:52:18