接上一篇:推荐使用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)相关推荐

  1. java 多态 降低耦合_java多态

    Java多态就是为了降低耦合,方便我们开发的一种特性. 比如我写了一个动物的接口.然后我通过接口实现了猫和狗这个类. 在我需要使用的时候我可以这样实例化对象 动物 w = new 猫. 这就是向上转型 ...

  2. 吕文翰 php,自己动手写一个 iOS 网络请求库(三)——降低耦合

    自己动手写一个 iOS 网络请求库(三)--降低耦合 2015-5-22 / 阅读数:16112 / 分类: iOS & Swift 本文中,我们将一起降低之前代码的耦合度,并使用适配器模式实 ...

  3. 原创经典-为什么Spring中的IOC(控制反转)能够降低耦合性(解耦)?

    学到Spring老师一定会讲一句话:IOC能够降低耦合性.可是为什么会降低耦合性,许多老师就讲不清了或者干脆不讲,下面我们通过举一些栗子,一步一步地说明为什么IOC能够降低耦合性. 前言 通过本文你将 ...

  4. P78-P79:城堡游戏代码修改:StringBuffer、封装来降低耦合、代码质量、StringBuffer

    ** P78-P79(城堡游戏代码修改:StringBuffer.封装来降低耦合.代码质量): ** P78-P79(城堡游戏代码修改:StringBuffer.封装来降低耦合.代码质量): 一.评判 ...

  5. 2021-AAAI-KCGN-面向社会推荐的知识感知耦合图神经网络

    标题:Knowledge-aware Coupled Graph Neural Network for Social Recommendation 翻译:<面向社会推荐的知识感知耦合图神经网络& ...

  6. java中接口降低耦合性_如何降低一个程序的耦合性

    耦合性是程序结构中各个模块之间相互关联的度量.它取决于各个模块之间接口的复杂程度.调用模块的方式以及哪些信息通过接口. 一般模块之间可能的连接方式有七种,构成耦合性的七种类型.它们之间的关系为(由弱到 ...

  7. Tornado 类与类组合降低耦合

    转载于:https://www.cnblogs.com/shiluoliming/p/6760548.html

  8. 21 利用分布式消息队列降低系统耦合性

    国内某大型互联网企业经常因为对同行的产品进行微创新,然后推岀自己的产品而遭人诟病,不讨论这种做法是否合适,我们分析这些产品,发现大多数都比原创产品有 更好的用户体验.这些产品常常后来居上,更速度地推岀 ...

  9. java多态 降低代码耦合性_如何降低耦合度

    一.什么是耦合度 耦合度就是某模块(类)与其它模块(类)之间的关联.感知和依赖的程度,是衡量代码独立性的一个指标,也是软件工程设计及编码质量评价的一个标准.耦合的强度依赖于以下几个因素:(1)一个模块 ...

  10. 如何构建优质的推荐系统服务?| 技术头条

    作者丨gongyouliu 来源 | 大数据与人工智能(ID:ai-big-data) 任何一个优质的软件服务都必须考虑高性能.高可用(HighAvailability).可伸缩.可拓展.安全性等5大 ...

最新文章

  1. 如何为网页添加小宠物挂件:小老鼠、金鱼等
  2. 记一次Java动态代理实践
  3. 大四中软实习笔记20130226
  4. 腾讯课堂的物理实验(2017计蒜客初赛第三场)
  5. 关于有朋友询问,Spartacus,Fiori,SAP UI5这些术语的关系
  6. git 回退到某个commit_it lesson2 版本回退
  7. 用easyx画五角星_【洛谷日报#195】有个东西叫EasyX
  8. java实现回溯算法,java基础面试笔试题
  9. httpClient中的三种超时时间设置
  10. 红米手机计算机软件,红米手机怎么连接电脑,手把手教你红米手机连接电脑的方法...
  11. Chef入门详解 Chef安装 Chef使用
  12. 珠海到各大机场的线路
  13. 华为鸿蒙摄像头,随时随地看一看!华为首款鸿蒙智能摄像头发布
  14. java组件及事件处理(11)--ActionListener一个窗口,两个事件
  15. 迪威视讯打造全国网格化管理样板 龙华“织网工程”
  16. QGIS 1. qgis的下载和安装(Windows和macOS)
  17. 源码深度解析之 Spring IOC
  18. Conflux尚书详解区块链不可能三角突围战
  19. 微信多开txt_微信多开技巧,拿去不用谢我!
  20. 微信小程序使用日历插件

热门文章

  1. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_13-页面静态化-数据模型-轮播图DataUrl接口...
  2. ES6深入浅出-1 新版变量声明:let 和 const-1.视频 概述
  3. 阶段3 2.Spring_09.JdbcTemplate的基本使用_2 JdbcTemplate的概述和入门
  4. 阶段3 2.Spring_05.基于XML的IOC的案例1_1 基于XML的IOC的案例-案例准备
  5. Backbone源码分析-noConflict
  6. css3 animate基本属性
  7. CSS3 结构性伪类选择器(1)
  8. python三级菜单的实现
  9. delphi.about.com 上的教材链接
  10. Java学习之Servlet-doGet()与doPost()