文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

1.背景

一般的WinForm中通过C#自带的Event机制便能很好的实现事件的注册和分发,但是,在插件系统中却不能这么简单的直接用已有的类来完成。一个插件本不包含另外一个插件,它们均是独立解耦的,实现插件和插件间的通信还需要我们设计出一个事件引擎来完成这个需求。

目前很多高级语言中基本都实现了观察者模式,并进行了自己的包装。比如C#中的delegate和event组合,java awt中的Event和addActionListener组合,Flex中的Event、addEventListener、dispatchEvent等。

不过这里如果要实现插件系统的事件机制,需要重新自己利用观察者模式来进行设计。而且还将涉及到泛型这个概念。

2.知识准备

2.1观察者模式

这里先给出观察者模式的UML图:

可以把观察者模式理解为两个部分:

(1)Obesrver(观察者):每个观察者均有自己的行为方式,但是他们均继承于同一个基类,此基类中定义了一个所有继承观察者均有的行为触发方法。

(2)Subject(触发者):触发者即是被观察者,在Subject中一定会有一个容器来存储与触发者相关的观察者,因为包含观察者容器,所以Subject方法中提供了注册和注销的方法。同时Subject中一定有一个触发方法,当调用此方法时,便会遍历装有观察者的容器,Obeserver类再利用多态特性实现了每个观察者特有的行为。

2.2. 泛型

泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。

事件机制中的通信数据因为不能确定为某种具体数据,在实现中,统一用泛型来代替。

3.以一个需求为线索

项目中需要在插件处理完影像后,将处理完的影像的地址、名称以及类型通知给宿主。然后宿主根据得到的消息和数据,将处理完后的影像展现出来。

4.设计完整的可导出的触发者(Subject)部分

这部分设计的UML图如下所示:

4.1设计单个触发者(Subject)

代码中实现了观察者容器、注入和发布部分。

4.2 设计要传递的内容(data)

我的项目中需要将插件处理完影像后,将处理完的影像的地址、名称以及类型通知给宿主。于是我将这样设计我的事件中包含的数据:

4.3 设计触发者子类(ConcreteSubject)

具体的要传递的数据是对应具体的触发者的。我们可以有多种多样的事件,而每种触发者将对应一种事件,所以这里需要设计多个触发者子类。针对3.1.2中说的插件处理完影像后的触发事件,这里给出实现的代码:

4.4 设计MEF中的契约(Contract)

4.5 设计触发者容器(EventAggregator)

触发者容器中包含了所有的触发者,并且提供了获取容器中具体触发者的方法,即GetEvent方法。代码中还给出了Export标签,这是为了让其他插件和组件加载后能够将触发者容器注入其中。这样需要将某个方法注入到一个具体的事件上时,则只需在触发者容器中通过GetEvent方法得到该触发者,然后将方法再subscribe到这个触发者中。

4.6整体结构

5. 设计完整的可注入的观察者(Observer)部分

5.1将触发者容器(EventAggregator)注入

5.2 将Observer注册到对应的触发者(Subject)中

首先获得需要注册入的ConcreteSubject,然后将Observer注入其中,这里的Observer是继承于Action的。

6.设计事件触发(invoke)部分

6.1将触发者容器(EventAggregator)注入

这里同样需要将EventAggregator注入到事件被触发的模块中。

6.2 触发机制的实现

首先获得需要触发的触发者(ConcreteSubject),然后将需要传递的信息实例化,最后触发这个事件(Publish)。

7.总结

到这里,我已经把我的MEF插件系统中的事件机制解析完了。其实说到底就是一个观察者模式的实现,只是在这个模式的基础上做了一个包装。在下一节中,我将主要讲解MEF插件中插件注入到宿主中的过程,和插件在宿主中界面的实现。

-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                

(3)MEF插件系统中通信机制的设计和实现的更多相关文章

  1. MEF插件系统中通信机制的设计和实现

    MEF插件系统中通信机制的设计和实现 1.背景 一般的WinForm中通过C#自带的Event机制便能很好的实现事件的注册和分发,但是,在插件系统中却不能这么简单的直接用已有的类来完成.一个插件本不包 ...

  2. Java生鲜电商平台-生鲜系统中微服务架构设计与分析实战

    Java生鲜电商平台-生鲜系统中微服务架构设计与分析实战 说明: Java生鲜系统中微服务的拆分应该如何架构设计与分析呢?以下是我的实战中的设计与经验分析. 目录 1. 微服务简介2. 当前现状3. ...

  3. 系统间通信——RPC架构设计

    架构设计:系统间通信(10)——RPC的基本概念 1.概述经过了详细的信息格式.网络IO模型的讲解,并且通过JAVA RMI的讲解进行了预热.从这篇文章开始我们将进入这个系列博文的另一个重点知识体系的 ...

  4. IM系统中聊天记录模块的设计与实现

    看到很多开发IM系统的朋友都想实现聊天记录存储和查询这一不可或缺的功能,这里我就把自己前段时间为傲瑞通(OrayTalk)开发聊天记录模块的经验分享出来,供需要的朋友参考下. 一.总体设计 1.存储位 ...

  5. CloudNotes之桌面客户端篇:插件系统的实现

    [CloudNotes版本更新历史与各版本下载地址请点击此处] [CloudNotes中文系列文章汇总列表请点击此处] [查看CloudNotes源代码请点击此处] 有时候,同一个名词,针对不同的人群 ...

  6. ctkPlugin插件系统实现项目插件式开发

    插件式开发体会: 自开始写[大话QT]系列就开始接触渲染客户端的开发,说是开发不如更多的说是维护以及重构,在接手这块的东西之前自己还有点犹豫,因为之前我一直认为客户端嘛,没什么技术含量,总是想做比较有 ...

  7. 浅谈C#中一种类插件系统编写的简单方法(插件间、插件宿主间本身不需要通信)

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 三年多前还在上研时,用C#+反射机制写过插件系统,后来又用M ...

  8. Android系统中的广播(Broadcast)机制简要介绍和学习计划

    在Android系统中,广播(Broadcast)是在组件之间传播数据(Intent)的一种机制:这些组件甚至是可以位于不同的进程中,这样它就像Binder机制一样,起到进程间通信的作用:本文通过一个 ...

  9. TensorFlow中的通信机制——Rendezvous(二)gRPC传输

    背景 [作者:DeepLearningStack,阿里巴巴算法工程师,开源TensorFlow Contributor] 本篇是TensorFlow通信机制系列的第二篇文章,主要梳理使用gRPC网络传 ...

随机推荐

  1. BSBuDeJie_04

    一 段子的下拉 建立模型 数字类型的用assign /* 当前页码 */ @property (nonatomic, assign) NSInteger page; 二 下拉上拉细节处理 三 细节处理 ...

  2. centos中yum安装mysql路径

    1. 使用命令service mysqld stop 停止mysql 查看mysql数据库的默认路径:/var/lib/mysql 使用cp -afir  /var/lib/mysql/*   /us ...

  3. return array 评论添加状态和提示信息

    ThinkSNS漏洞系列第一弹,某处处理不当导致SQL注入 漏洞点出现在Comment Widget里:\addons\widget\CommentWidget\CommentWidget.class ...

  4. jvm的内存分配总结

    最近看了周志明版本的<深入理解Java虚拟机>第一版和第二版,写的很好,收获很多,此处总结一下.   jvm中内存划分:   如上图,一共分为五块,其中: 线程共享区域为: 1.java堆 ...

  5. WebView解析

    WebView解析   WebView是一个基于Webkit的,相当于内置浏览器的强大功能的组件,WebView的使用这么分四步说明:添加组件,加载资源,属性设置,辅助功能. 一.WebView的添加 ...

  6. (一)Linux相关内容的简介

    1.Linux内核官网:www.kernel.org 2.Linux主要发行版本: (1)redhat  服务器中常见(部分功能收费); (2)Ubuntu  图形界面较好,但是服务器中很少用: (3 ...

  7. 嵌入式的重要平台 .NET Micro Framework

    曾经辉煌的巨人PC界渐渐走向下坡路,而智能手机圈则没完没了般地争个你死我活.随着智能手机的广泛普及,不少商家为了不坐以待毙而纷纷开始涉足与穿戴式设备--智能手表(具体参见智能手表时代还有多远). 我们 ...

  8. TaintDroid剖析之Native方法级污点跟踪分析

    1.Native方法的污点传播 在前两篇文章中我们详细分析了TaintDroid对DVM栈帧的修改,以及它是如何在修改之后的栈帧中实现DVM变量级污点跟踪的.现在我们继续分析其第二个粒度的污点跟踪—— ...

  9. Expert 诊断优化系列------------------给TempDB 降温

    前面文章针对CPU.内存.磁盘.语句.等待讲述了SQL SERVER的一些基本的问题诊断与调优方式.为了方便阅读给出导读文章链接方便阅读: SQL SERVER全面优化-------Expert fo ...

  10. 玩转JavaScript OOP[3]——彻底理解继承和原型链

    概述 上一篇我们介绍了通过构造函数和原型可以实现JavaScript中的“类”,由于构造函数和函数的原型都是对象,所以JavaScript的“类”本质上也是对象.这一篇我们将介绍JavaScript中 ...