网站后台管理怎么进,松江郑州阳网站建设,长沙有什么做试卷的网站,石家庄房产网写在前面#xff1a;下面学习所得多是从自http://www.cnblogs.com/comsokey/p/MEF1.html和http://www.cnblogs.com/yunfeifei/p/3922668.html两位大神的文章里学到的#xff0c;特别鸣谢#xff01;整理下是更大一方面是对自己知识的梳理#xff0c;用词用句不够准确#… 写在前面下面学习所得多是从自http://www.cnblogs.com/comsokey/p/MEF1.html和http://www.cnblogs.com/yunfeifei/p/3922668.html两位大神的文章里学到的特别鸣谢整理下是更大一方面是对自己知识的梳理用词用句不够准确见谅看不懂的可自行参考两位大神的原文。 一.定义和特性 定义MEFManagered Extensibility Framework. 特性减少代码耦合度利用封装代码轻松搞定工程。 我的理解利用Export与Import相协作让系统自动匹配需要。 本文实例在后面有下载内部各代码都有解释不懂的可以下载看看。 二.实例说话 1.定义接口 namespace MEFMovie
{public interface Data{string Name { get; set; }string Type { get; set; }string TimeOut { get; set; }string GetMovie();}
}定义interface接口为后面需要继承的类做准备 2.数据类设置 namespace MEFMovie
{[Export(HorribleMovie, typeof(Data))]public class HorribleMovie : Data{public string Name { get; set; }public string Type { get; set; }public string TimeOut { get; set; }public string GetMovie(){Name 11111;return HorribleMovie;}}[Export(typeof(Data))][ExportMetadata(obj,00000)]public class LoveMovie : Data{[Export(typeof(string))]public string MovieAct01 周杰伦;[Export(typeof(string))]public string MovieAct02 周润发;[Export(typeof(string))]public string MovieAct03 周星驰;public string Name { get; set; }public string Type { get; set; }public string TimeOut { get; set; }public string GetMovie(){return LoveMovie;}}[Export(ComedyMovie, typeof(Data))][ExportMetadata(obj, 222222)] public class ComedyMovie : Data{public string Name { get; set; }public string Type { get; set; }public string TimeOut { get; set; }public string GetMovie(){return ComedyMovie;}}
}在继承时需要把接口相应的属性和方法完整写出来Name,Type,TimeOut和GetMovie Export为导出该继承类的数据在使用时请先引用 Export格式为[Export(XXX,TypeOf(XX))] 其中XXX是契约名这是为了在继承类很多时方便寻找需要的类契约名可以不写[Export(TypeOf(XX))]。 TypeOf(XX)是指导出类型XX一般是类继承的接口 上述三个类分别用了三种导出方式 1.HorribleMovie[Export(HorribleMovie, typeof(Data))] 2.LoveMovie[Export(typeof(Data))] 3.ComedyMovie[Export(ComedyMovie, typeof(Data))] 这是博主在疑问Export的使用格式时做的N多无用测试有疑问的可以继续试试 3.辅助插件 public interface OtherMate{string obj { get; }}后面会做解释 4.数据显示 namespace MEFMovie
{public class DataManager{public string Act { get; set; }//对应[Export(HorribleMovie, typeof(Data))]导出内容[Import(HorribleMovie)]Data HorribleMovieData;//导入多个继承接口Data的类[ImportMany(typeof(Data))]public IEnumerableData datass { get; set; }[ImportMany(typeof(Data))]public IEnumerableLazyData, OtherMate data { get; set; }//对应导出 [Export(ComedyMovie, typeof(Data))][Import(ComedyMovie)]Data ComedyMovie { get; set; }//对应所有 [Export(typeof(string))][ImportMany(typeof(string))]public Liststring MovieActs { get; set; }//程序启动时做下列动作public void Open(){//找到所有文件下的dll程序集只有这样才能找到Datas下的各个数据类//注意引用using System.ComponentModel.Composition;//using System.ComponentModel.Composition.Hosting;var catalog new AssemblyCatalog(Assembly.GetExecutingAssembly());var container new CompositionContainer(catalog);container.ComposeParts(this);//下面是对数据做出显示方便辩证程序是否成功//对导入的string类型数据做遍历 并显示foreach (var ss in MovieActs){Act ss;}//对导入HorribleMovie做辩证Act HorribleMovieData.GetMovie();//对导入的ComedyMovie做辩证Act ComedyMovie.GetMovie();//对接口的属性做辩证 前面赋值11111Act HorribleMovieData.Name;//辅助插件的作用在这个程序里是对数据做筛选foreach (var s in data.Where(item item.Metadata.obj reds())){Act s.Metadata;}}//筛选标准private string reds(){string s 00000;return s;}}上面各Import是对导出的Export做导入 ImportMany是指导入多个它后面的TpyeOf可以省略不写ImportMany即可。 public IEnumerableLazyData, OtherMate data { get; set; } 是用辅助插件做筛选后续调用item.metadata.obj做比较得出结果。 5.示例下载转载于:https://www.cnblogs.com/Khan-Sadas/p/4918040.html