好久没有写博客了,今天抽空继续写MEF系列的文章。有园友提出这种系列的文章要做个目录,看起来便利,所以就抽空做了一个,放到每篇文章的最后。
前面四篇讲了MEF的根本常识,学完了前四篇,,MEF中对照常用的根基已经讲完了,相信大家已经能看出MEF所带来的便当了。今天就介绍一些MEF中一些较为不常用的对象,也就是大家口中的所谓的对照高级的用法。
前面讲的导出都是在每个类上面添加Export注解,实现导出的,那么有没有一种对照简便的要领呢?答案是有的,就是在接口上面写注解,这样只要实现了这个接口的类城市导出,而不需要在每个类上面都写注解。下面仅贴出接口和一个实现类的源码,其余的仿照即可:
接口代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel.Composition; namespace BankInterface { [InheritedExport] public interface ICard { //账户金额 double Money { get; set; } //获取账户信息 string GetCountInfo(); //存钱 void SaveMoney(double money); //取钱 void CheckOutMoney(double money); } }
接口上面添加了[InheritedExport]符号,没错,这个就是用在接口上面的注解。
下面给出一个实现类的代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using BankInterface; using System.ComponentModel.Composition; namespace BankOfChina { //[Export(typeof(ICard))] public class ZHCard : ICard { public string GetCountInfo() { return "Bank Of China"; } public void SaveMoney(double money) { this.Money += money; } public void CheckOutMoney(double money) { this.Money -= money; } public double Money { get; set; } } }
可以看到,我注释失了导出的注解,运行后,依然可以看到,此类还是被导出了,运行功效相信看过上一篇的都已经知道了。
注意:这种要领虽然对照简单,但是只适用于对照简单的应用,看完下面后,相信大家会意识到他的不敷。
下面进入今天的重点:
MEF中如何访谒某个具体的东西
前面我们讲过在导出的时候,可以在[Export()]注解中插手名称标识,从而识别某个具体的东西,然而这种要领只是用于页面初始化的时候就行过滤,页面打开后没有导入的就再也导入不了了,就是说我们不能在导入的调集中辨别各自的差别,所有导入的类都是没有标识的。
为了给每一个类添加标识,我们要担任ExportAttribute类,为他添加标识属性MetaData,首先来写担任自ExportAttribute的类,代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel.Composition; namespace BankInterface { /// <summary> /// AllowMultiple = false,代表一个类不允许多次使用此属性 /// </summary> [MetadataAttribute] [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] public class ExportCardAttribute : ExportAttribute { public ExportCardAttribute() :base(typeof(ICard)) { } public string CardType { get; set; } } }
代码很简单,挪用的父类的结构要领,声明了一个属性CatdType,下面来添加一个接口,直接改削ICard接口文件,代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel.Composition; namespace BankInterface { public interface ICard { //账户金额 double Money { get; set; } //获取账户信息 string GetCountInfo(); //存钱 void SaveMoney(double money); //取钱 void CheckOutMoney(double money); } public interface IMetaData { string CardType { get;} } }
又添加了接口IMetaData,只有一个属性,注意这个属性要和刚写的ExportCardAttribute类中的属性名称要一致,这样才华实现导出。
下面操作我们的ExportCardAttribute属性来符号我们要导出的类: