MEF宿主应用程序
在应用程序中宿主MEF
Managed Extensibility Framework(MEF)是.NET平台下的一个扩展性管理框架,他的特点如下:
1、.net下的一个可扩展行管理框架,包括了依赖注入和Duck Typing。
2、 轻松应对应用程序扩展并且对已有代码产生最小影响。
3、 应用程序和扩展程序之间不产生直接依赖,多个同样需求共享扩展程序。
参照http://mef.codeplex.com上面的教程尝试实现了一个示例
实现的步骤如下:
1、创建一个wpf的Console Application,宿主就是Program class
2、添加System.ComponentModel.Composition程序集和相关引用
3、添加一个Compone()方法,创建组合容器
4、添加一个方法,调用Compone()方法
5、在Main方法里实例化宿主
6、定义在宿主中导出的部件
7、在宿主中导出部件
8、添加部件到容器,方法有二
1.直接添加组合部件实例
2.使用目录添加组合部件
实现代码:
using System; using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; namespace MEFConsole { /// <summary> /// 宿主 /// </summary> class Program { static void Main(string[] args) { Program p = new Program(); p.Run1(); p.Run2(); } /// <summary> /// 导入 /// </summary> [Import] public IWaiter waiter { get; set; } /// <summary> /// 实例化组合容器 /// 直接添加部件 /// </summary> private void Compone1() { var container = new CompositionContainer(); container.ComposeParts(this, new Waiter()); } /// <summary> /// 测试直接添加部件方法 /// </summary> public void Run1() { Console.WriteLine("直接添加部件到容器方式:"); Compone1(); waiter.Welcome(); waiter.Serve("糖醋里脊"); waiter.GoodBye(); Console.WriteLine(); //Console.Read(); } /// <summary> /// 实例化组合容器类 /// 通过目录添加部件 /// </summary> private void Compone2() { var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()); var container2 = new CompositionContainer(catalog); container2.ComposeParts(this); } /// <summary> /// 测试通过目录添加控件 /// </summary> public void Run2() { Console.WriteLine("通过目录添加部件到容器方式:"); Compone2(); waiter.Welcome(); waiter.Serve("糖醋里脊"); waiter.GoodBye(); Console.Read(); } } /// <summary> /// 声明服务员接口 /// </summary> public interface IWaiter { void Welcome(); void Serve(string name); void GoodBye(); } /// <summary> /// 服务员类 /// 标记为导出 /// </summary> [Export(typeof(IWaiter))] public class Waiter : IWaiter { public void Welcome() { Console.WriteLine("欢迎光临!"); } public void Serve(string name) { Console.WriteLine("先生您点的菜" + name + "来了,请慢用!"); } public void GoodBye() { Console.WriteLine("欢迎下次光临!"); } } }执行结果: