(3)MEF插件系统中通信机制的设计和实现

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插件中插件注入到宿主中的过程,和插件在宿主中界面的实现。

(3)MEF插件系统中通信机制的设计和实现

时间: 2024-10-27 06:15:57

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

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

看到很多开发IM系统的朋友都想实现聊天记录存储和查询这一不可或缺的功能,这里我就把自己前段时间为傲瑞通(OrayTalk)开发聊天记录模块的经验分享出来,供需要的朋友参考下. 一.总体设计 1.存储位置 从一开始我们就打算在服务端和客户端本地同时存储聊天记录,而且,在客户端查看聊天记录时,可以选择是从本地加载.还是从服务器加载.这样做的好处有两个: (1)从本地加载聊天记录速度非常快. (2)当更换了登录的机器,在任何地方任何时刻都可以从服务器加载完整的聊天记录,记录永远不会丢失. 2.存储方案

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

[CloudNotes版本更新历史与各版本下载地址请点击此处] [CloudNotes中文系列文章汇总列表请点击此处] [查看CloudNotes源代码请点击此处] 有时候,同一个名词,针对不同的人群,应该采用不同的表达方式.比如插件的概念,对于程序员而言,可以将其称为插件,或者扩展.对于用户而言,或许"扩展功能"一词会更加贴切.本文还是脱离不了码农的气质,继续讨论技术问题,因此,我会以"插件"一词进行描述. 概述 从1.0.5504.38654版本开始,Cloud

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

插件式开发体会: 自开始写[大话QT]系列就开始接触渲染客户端的开发,说是开发不如更多的说是维护以及重构,在接手这块的东西之前自己还有点犹豫,因为之前我一直认为客户端嘛,没什么技术含量,总是想做比较有挑战性的,为了这周总还专门找我谈了谈,算是“安抚”民心吧.正式谈话过后,我才决定接手渲染客户端的开发. 渲染客户端的所有构成均是采用开源框架拼凑起来的整体,细分它的组成大致包含以下开源模块,简单描述: 1> CTKPlugin插件系统框架.负责整个项目的架构,决定了项目采用插件形式开发维护. 2>

浅谈C#中插件系统编写的一种简单方法

1.背景 几年前还在上学时,用C#+反射机制写过插件系统,后来又用MEF写过插件系统.插件系统本身具有易于扩展的优势,所以在实际项目中使用很频繁.即使在B/S项目中,插件的思想也是大行其道,比如前端单页面+AMD编程便可以理解为一种插件机制,以及后台扩展项目统一打包为一个jar放入主系统jar文件中一起发布,也可以理解为插件思想的运用. 这里我们回到C/S插件系统编写的问题上.由于之前诸多项目编写是将插件编译成dll,然后进行解析.这样做有其好处,即宿主中可以对各个模块解析,完成插件间.插件和主

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

在Android系统中,广播(Broadcast)是在组件之间传播数据(Intent)的一种机制:这些组件甚至是可以位于不同的进程中,这样它就像Binder机制一样,起到进程间通信的作用:本文通过一个简单的例子来学习Android系统的广播机制,为后续分析广播机制的源代码作准备. 在Android系统中,为什么需要广播机制呢?广播机制,本质上它就是一种组件间的通信方式,如果是两个组件位于不同的进程当中,那么可以用Binder机制来实现,如果两个组件是在同一个进程中,那么它们之间可以用来通信的方式

LMT NEW PBS作业排队系统的队列通信机制

LMT NEW PBS作业排队系统的队列通信机制 LMT NEW PBS作业排队运算系统提供了一种队列通信机制,允许消息按某种排队规则存储到持续介质或非持续介质(如内存)中,然后再转发给其它处理进程.这种存储转发机制可以保证在两个通信实体之间传递的消息不丢失.不重传,从而保证交易的完整性. LMT NEW PBS的队列通信 LMT NEW PBS的队列通信用到了两个服务器:消息队列服务器和消息转发服务器.消息队列服务器用于对消息进行出队入队管理,消息转发服务器用于将消息从队列中取出,转发给服务器

架构设计:系统间通信(23)——提高ActiveMQ工作性能(中)

(接上文<架构设计:系统间通信(22)--提高ActiveMQ工作性能(上)>) 6.ActiveMQ处理规则和优化 在ActiveMQ单个服务节点的优化中,除了对ActiveMQ单个服务节点的网络IO模型进行优化外,生产者发送消息的策略和消费者处理消息的策略也关乎整个消息队列系统是否能够高效工作.请看下图所示的消息生产者和消息消费者的简要工作原理图: Producer既是消息生产者,作为一个发送消息的客户端它既可以使用同步消息发送模式,也可以使用异步的消息发送模式.另外,消息生产者在Acti

架构设计:系统间通信(29)——Kafka及场景应用(中2)

接上文:<架构设计:系统间通信(28)--Kafka及场景应用(中1)> 4-3.复制功能 我们在上文中已经讨论了Kafka使用分区的概念存储消息,一个topic可以有多个分区它们分布在整个Kafka集群的多个Broker服务节点中,并且一条消息只会按照消息生产者的要求进入topic的某一个分区.那么问题来了:如果某个分区中的消息在被消费端Pull之前,承载该分区的Broker服务节点就因为各种异常原因崩溃了,那么在这个Broker重新启动前,消费者就无法收到消息了. 为了解决这个问题,Apa

LMT NODE PBS作业排队系统的队列通信机制

LMT NODE PBS作业排队系统的队列通信机制 LMT NODE PBS作业排队运算系统提供了一种队列通信机制,允许消息按某种排队规则存储到持续介质或非持续介质(如内存)中,然后再转发给其它处理进程.这种存储转发机制可以保证在两个通信实体之间传递的消息不丢失.不重传,从而保证交易的完整性. LMT NODE PBS的队列通信 LMT NODE PBS的队列通信用到了两个服务器:消息队列服务器和消息转发服务器.消息队列服务器用于对消息进行出队入队管理,消息转发服务器用于将消息从队列中取出,转发