推荐使用MEF降低耦合(2)
接上一篇:推荐使用MEF降低耦合
本章主旨:在上一篇基础上新增 1)如何通过添加标记,区分插件类实现接口 2)优化设计AggregateCatalog的加载
1)如何通过添加标记,
1 /// <summary> 2 /// 插件类1 实现接口 3 /// </summary> 4 [Export(typeof(DemoOneInterface))] 5 public class DemoOneInherit1 : DemoOneInterface 6 { 7 public string GetName() 8 { 9 return "DemoOneInherit1"; 10 } 11 }
1 /// <summary> 2 /// 插件类2 实现接口 3 /// </summary> 4 [Export(typeof(DemoOneInterface))] 5 public class DemoOneInherit2 : DemoOneInterface 6 { 7 public string GetName() 8 { 9 return "DemoOneInherit2"; 10 } 11 }
现在的问题是:如果能区分以下 “插件类2 实现接口” 和“ 插件类2 实现接口”那就好了,为了解决这个问题,引入ExportMetadata来为插件的特殊属性进行标记。
新增插件标记接口
1 public interface DemoOneInterfaceDepict 2 { 3 string Depict{get;} 4 }
添加 :为插件定义描述
1 /// <summary> 2 /// 插件类1 实现接口 3 /// </summary> 4 [Export(typeof(DemoOneInterface))] 5 //为插件定义描述 6 [ExportMetadata("Depict", "插件类1")] 7 public class DemoOneInherit1 : DemoOneInterface 8 { 9 public string GetName() 10 { 11 return "DemoOneInherit1"; 12 } 13 }
1 /// <summary> 2 /// 插件类2 实现接口 3 /// </summary> 4 [Export(typeof(DemoOneInterface))] 5 //为插件定义描述 6 [ExportMetadata("Depict", "插件类2")] 7 public class DemoOneInherit2 : DemoOneInterface 8 { 9 public string GetName() 10 { 11 return "DemoOneInherit2"; 12 } 13 }
修改代码:新增标记接口DemoOneInterfaceDepict,并且引入Lazy延迟加载,获取标记信息
[ImportMany]
IEnumerable<Lazy<DemoOneInterface, DemoOneInterfaceDepict>> DoList;
1 string Inherit = System.Configuration.ConfigurationSettings.AppSettings["Inherit"]; 2 string name = ""; 3 foreach (var _do in DoList.Where(e=>e.Metadata.Depict==Inherit)) 4 { 5 name = _do.Value.GetName(); 6 }
2)优化设计AggregateCatalog的加载,不用每次都写一次,
1 var catalog = new AggregateCatalog(); 2 catalog.Catalogs.Add(new AssemblyCatalog(typeof(T).Assembly)); 3 catalog.Catalogs.Add(new DirectoryCatalog(path)); 4 var _container = new CompositionContainer(catalog); 5 _container.ComposeParts(obj); 6 return obj;
新增 静态抽象类 public static class ObjectExtBase 因为c#不可以同时继承多个类,因此做成扩展方法
1 /// <summary> 2 /// 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 /// <param name="obj"></param> 6 /// <param name="path">引入的路径</param> 7 /// <returns></returns> 8 public static T ComposePartsSelf<T>(this T obj,string path) where T : class 9 { 10 var catalog = new AggregateCatalog(); 11 catalog.Catalogs.Add(new AssemblyCatalog(typeof(T).Assembly)); 12 catalog.Catalogs.Add(new DirectoryCatalog(path)); 13 var _container = new CompositionContainer(catalog); 14 _container.ComposeParts(obj); 15 return obj; 16 }
在引入的时候,只需要调用 this.ComposePartsSelf(path);即可
1 static void Main(string[] args) 2 { 3 var demo = new DemoOne(@"H:\开发资料\WinFormsAppMEF\ConsoleApplication1\Addin");//遍历运行目录下的Addin文件夹,查找所需的插件。 4 Console.WriteLine(demo.Run()); 5 Console.ReadLine(); 6 }
代码下载
转载于:https://www.cnblogs.com/jxsd/p/4906810.html
推荐使用MEF降低耦合(2)相关推荐
- java 多态 降低耦合_java多态
Java多态就是为了降低耦合,方便我们开发的一种特性. 比如我写了一个动物的接口.然后我通过接口实现了猫和狗这个类. 在我需要使用的时候我可以这样实例化对象 动物 w = new 猫. 这就是向上转型 ...
- 吕文翰 php,自己动手写一个 iOS 网络请求库(三)——降低耦合
自己动手写一个 iOS 网络请求库(三)--降低耦合 2015-5-22 / 阅读数:16112 / 分类: iOS & Swift 本文中,我们将一起降低之前代码的耦合度,并使用适配器模式实 ...
- 原创经典-为什么Spring中的IOC(控制反转)能够降低耦合性(解耦)?
学到Spring老师一定会讲一句话:IOC能够降低耦合性.可是为什么会降低耦合性,许多老师就讲不清了或者干脆不讲,下面我们通过举一些栗子,一步一步地说明为什么IOC能够降低耦合性. 前言 通过本文你将 ...
- P78-P79:城堡游戏代码修改:StringBuffer、封装来降低耦合、代码质量、StringBuffer
** P78-P79(城堡游戏代码修改:StringBuffer.封装来降低耦合.代码质量): ** P78-P79(城堡游戏代码修改:StringBuffer.封装来降低耦合.代码质量): 一.评判 ...
- 2021-AAAI-KCGN-面向社会推荐的知识感知耦合图神经网络
标题:Knowledge-aware Coupled Graph Neural Network for Social Recommendation 翻译:<面向社会推荐的知识感知耦合图神经网络& ...
- java中接口降低耦合性_如何降低一个程序的耦合性
耦合性是程序结构中各个模块之间相互关联的度量.它取决于各个模块之间接口的复杂程度.调用模块的方式以及哪些信息通过接口. 一般模块之间可能的连接方式有七种,构成耦合性的七种类型.它们之间的关系为(由弱到 ...
- Tornado 类与类组合降低耦合
转载于:https://www.cnblogs.com/shiluoliming/p/6760548.html
- 21 利用分布式消息队列降低系统耦合性
国内某大型互联网企业经常因为对同行的产品进行微创新,然后推岀自己的产品而遭人诟病,不讨论这种做法是否合适,我们分析这些产品,发现大多数都比原创产品有 更好的用户体验.这些产品常常后来居上,更速度地推岀 ...
- java多态 降低代码耦合性_如何降低耦合度
一.什么是耦合度 耦合度就是某模块(类)与其它模块(类)之间的关联.感知和依赖的程度,是衡量代码独立性的一个指标,也是软件工程设计及编码质量评价的一个标准.耦合的强度依赖于以下几个因素:(1)一个模块 ...
- 如何构建优质的推荐系统服务?| 技术头条
作者丨gongyouliu 来源 | 大数据与人工智能(ID:ai-big-data) 任何一个优质的软件服务都必须考虑高性能.高可用(HighAvailability).可伸缩.可拓展.安全性等5大 ...
最新文章
- 如何为网页添加小宠物挂件:小老鼠、金鱼等
- 记一次Java动态代理实践
- 大四中软实习笔记20130226
- 腾讯课堂的物理实验(2017计蒜客初赛第三场)
- 关于有朋友询问,Spartacus,Fiori,SAP UI5这些术语的关系
- git 回退到某个commit_it lesson2 版本回退
- 用easyx画五角星_【洛谷日报#195】有个东西叫EasyX
- java实现回溯算法,java基础面试笔试题
- httpClient中的三种超时时间设置
- 红米手机计算机软件,红米手机怎么连接电脑,手把手教你红米手机连接电脑的方法...
- Chef入门详解 Chef安装 Chef使用
- 珠海到各大机场的线路
- 华为鸿蒙摄像头,随时随地看一看!华为首款鸿蒙智能摄像头发布
- java组件及事件处理(11)--ActionListener一个窗口,两个事件
- 迪威视讯打造全国网格化管理样板 龙华“织网工程”
- QGIS 1. qgis的下载和安装(Windows和macOS)
- 源码深度解析之 Spring IOC
- Conflux尚书详解区块链不可能三角突围战
- 微信多开txt_微信多开技巧,拿去不用谢我!
- 微信小程序使用日历插件
热门文章
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_13-页面静态化-数据模型-轮播图DataUrl接口...
- ES6深入浅出-1 新版变量声明:let 和 const-1.视频 概述
- 阶段3 2.Spring_09.JdbcTemplate的基本使用_2 JdbcTemplate的概述和入门
- 阶段3 2.Spring_05.基于XML的IOC的案例1_1 基于XML的IOC的案例-案例准备
- Backbone源码分析-noConflict
- css3 animate基本属性
- CSS3 结构性伪类选择器(1)
- python三级菜单的实现
- delphi.about.com 上的教材链接
- Java学习之Servlet-doGet()与doPost()