MEF体验使用接口导出的优越性
2010-11-09 23:36
204 查看
组合部件是MEF的组合单元,一个组合部件可以为其他部件提供导出服务,也可以导入其他部件的服务,一个部件至少包含一个导出。在MEF中通过Export和Import特性来标示导出和导入,部件可以直接添加到组合容器,也可以通过目录添加到组合容器,默认的目录是通过Export来标示的。
部件之间没有依赖关系,但是部件都依赖于契约。默认情况下应使用类型契约而不是字符串契约,字符串契约容易导致模糊。如果必须使用可以添加公司名称、命名空间等前缀。
对于导出的契约可以使用固定的类,但是通常使用接口和抽象类,这样用很方便一次导入多个不同的类,下面通过示例来展示这个优越性。
注:这样使用必须每个导出标记特定的接口类型否则类型本身被导出
示例:
执行结果:
部件之间没有依赖关系,但是部件都依赖于契约。默认情况下应使用类型契约而不是字符串契约,字符串契约容易导致模糊。如果必须使用可以添加公司名称、命名空间等前缀。
对于导出的契约可以使用固定的类,但是通常使用接口和抽象类,这样用很方便一次导入多个不同的类,下面通过示例来展示这个优越性。
注:这样使用必须每个导出标记特定的接口类型否则类型本身被导出
示例:
using System; using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; using System.Collections.Generic; namespace ContractConsole { /// <summary> /// 宿主 /// </summary> class Program { /// <summary> /// 导入特定的导出集 /// </summary> [ImportMany] public IEnumerable<IWaiter> waiters { get; set; } static void Main(string[] args) { Program p = new Program(); p.Run(); } /// <summary> /// 测试导入 /// </summary> public void Run() { Compent(); Notify("小张"); Console.Read(); } /// <summary> /// 组合容器 /// </summary> private void Compent() { var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()); var container = new CompositionContainer(catalog); container.ComposeParts(this); } /// <summary> /// 调用导入对象的方法 /// </summary> /// <param name="name"></param> public void Notify(string name) { foreach (IWaiter waiter in waiters) { waiter.Hellow(); waiter.Service(name); waiter.GoodBye(); Console.WriteLine(); } } } /// <summary> /// 接口 /// </summary> public interface IWaiter { void Hellow(); void Service(string name); void GoodBye(); } /// <summary> /// 导出餐厅类 /// </summary> [Export(typeof(IWaiter))] public class DiningRoomWaiter : IWaiter { public void Hellow() { Console.WriteLine("欢迎光临老麻抄手!"); } public void Service(string name) { Console.WriteLine("先生您要的三两清汤抄手,请慢用!-----------" + name); } public void GoodBye() { Console.WriteLine("欢迎下次光临!"); } } /// <summary> /// 导出酒吧类 /// </summary> [Export(typeof(IWaiter))] public class BarWaiter : IWaiter { public void Hellow() { Console.WriteLine("欢迎光临炫酷酒吧!"); } public void Service(string name) { Console.WriteLine("先生您要的一杯啤酒,请慢用!-----------" + name); } public void GoodBye() { Console.WriteLine("欢迎下次光临!"); } } }
执行结果:
相关文章推荐
- MEF: MSDN 杂志上的文章(10) 使用元数据区分导出
- MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)
- 使用SWIG实现C++导出python接口的配置
- 【转】MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)
- MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)
- 使用 MEF 公开 Silverlight“.NET研究” MVVM 应用程序中的接口
- 国内几款接口管理平台,使用体验分析对比;总有一款是你想要的!
- 使用perl通过adsi接口导出AD帐户列
- 使用zlib压缩解压并导出lua接口
- 【转】MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)
- 一起谈.NET技术,使用 MEF 公开 Silverlight MVVM 应用程序中的接口
- 百灵报表(BIRT)接口学习:使用Data Extraction Task导出数据
- MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)
- .使用Swagger导出rest接口文档
- MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)
- 使用接口适配模式做报表导出
- php数组 类和对象 接口使用方法(1/3)
- Mysql使用mysqldump按时间导出时,结果数据与预期不同
- 使用apache的poi实现导入导出excel
- java使用SAX接口解析xml文件