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

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

1.背景

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

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

不过这里若是要实现插件系统的事件机制,须要从新本身利用观察者模式来进行设计。并且还将涉及到泛型这个概念。插件

2.知识准备

2.1观察者模式

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

 

能够把观察者模式理解为两个部分:3d

(1)Obesrver(观察者):每一个观察者均有本身的行为方式,可是他们均继承于同一个基类,此基类中定义了一个全部继承观察者均有的行为触发方法。orm

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

2.2. 泛型

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

事件机制中的通讯数据由于不能肯定为某种具体数据,在实现中,统一用泛型来代替。继承

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/

                                                             若是您以为本文确实帮助了您,能够微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                

相关文章
相关标签/搜索