构建插件式的应用程序框架(六)----通讯机制(ZT)

前天发了构建插件式的应用程序框架(五)----管理插件这篇文章,有几个朋友在回复中希望了解插件之间是如何通讯的。
这个系列的文章写到这里,也该谈谈这个问题了,毕竟已经有了插件管理。不知道大家有没有注意到我在第四篇文章里谈到的服务容器(Service Container),Service是我所提到的插件式的应用程序框架的基础,我们也可以回头看看IApplication的接口定义,IApplication是派生于IServiceContainer。我把应用程序提供的相关的功能抽象成一个一个的Service,比如文档管理的,我们就抽象成IDocumentService,停靠工具栏管理功能抽象成IDockBarService,菜单管理的功能抽象成IMenuService,等等。我在第四篇文章里也提到了“我们在使用Service架构的时候,总是倾向于有一个根容器,各个Service容器构成了一个Service容器树,每一个节点的服务都可以一直向上传递,直到根部,而每一个节点请求Service的时候,我们总是可以从根节点获得。我把这个根节点比喻成一个服务中心,它汇总了所有可提供的服务,当某个对象要请求服务(GetService)只需要向根结点发送要获得的服务,根结点就可以把服务的对象传递给它。”
IApplication是从IServiceContainer接口派生出来的,而我们的应用程序主窗口又是从IApplication接口派生出来的,所以,我们的应用程序主窗口就是一个ServiceContainer。从IPlugin的定义来看,它有一个IApplication接口属性,这个IApplication属性是什么时候指定的呢,在第五篇文章的源代码里我们看到,当每一个Plugin被实例化的时候,由PluginService指定的,所以在每一个Plugin被Load之前,IApplication已经被指定,而代表这个IApplication接口的实例正是我们的应用程序主窗口,而它正是我们所需要的服务容器。一旦我们能够获得IApplication实例,我们就可以获得整个应用程序所提供的所有的服务。假设我们要获得文档服务,就可以使用Plugin的Application.GetService(typeof(IdocumentService))来得到文档服务的实例,接着我们就可以使用这个实例来完成某项功能,比如添加一个新文档等等,其实在第五篇文章的源代码就有这样代码:
      
None.gifprivate void CheckExistedPlugin()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif{
InBlock.gif            IPluginService pluginService 
= (IPluginService)application.GetService(typeof(IPluginService));
InBlock.gif            
if (pluginService != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                List
<String> nameList=new List<string>();
InBlock.gif                String[] pluginNames 
= pluginService.GetAllPluginNames();
InBlock.gif                nameList.AddRange(pluginNames);
InBlock.gif                
foreach (ListViewItem item in listView1.Items)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
if (nameList.Contains(item.Text))
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        item.Checked 
= true;
ExpandedSubBlockEnd.gif                    }

ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }
      当然,要在插件中获得实例,你必须在应用程序里或者其他插件里实例化服务对象,然后添加到服务容器里,还拿上边的例子,我们在应用程序里实例化了PluginService,然后添加到了容器里,代码如下:
   
None.gif        public MainForm()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif{
InBlock.gif            InitializeComponent();
InBlock.gif            pluginService 
= new PluginService(this);
InBlock.gif            serviceContainer.AddService(
typeof(IPluginService), pluginService);
ExpandedBlockEnd.gif        }

      稍后,我会继续完善这个例子,做一个简单的多文档编辑器来做演示,并提供一些基础的服务,以便大家阅读

转载于:https://www.cnblogs.com/chinhr/archive/2007/06/18/787414.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能产业2018年待解的三大难题

来源&#xff1a;人民邮电报概要&#xff1a;2017年&#xff0c;人工智能领域在算法、政策、资金等方面已经出现了三大突破&#xff0c;业界欢欣鼓舞的情形很像1999年年底网络泡沫泛滥时的情形。2017年&#xff0c;人工智能领域在算法、政策、资金等方面已经出现了三大突破&…

矩阵连乘问题(c++)

矩阵连乘问题 问题描述&#xff1a; 给定n个矩阵&#xff1a;A1,A2,…,An&#xff0c;其中Ai与Ai1是可乘的&#xff0c;i1&#xff0c;2…&#xff0c;n-1。确定计算矩阵连乘积的计算次序&#xff0c;使得依此次序计算矩阵连乘积需要的数乘次数最少。输入数据为矩阵个数和每个矩…

QuestMobile 2017年中国移动互联网年度报告

来源&#xff1a;QuestMobile2017年&#xff0c;科技的风口兜兜转转&#xff0c;从直播、VR到AI再到区块链、短视频泛娱乐IP&#xff0c;最终在2017年底定格在了知识付费上&#xff0c;然而这并没有结束&#xff0c;紧随知识付费而来的就是撒币、大撒币……这就是中国移动互联网…

Python 读写配置文件模块: configobj 和 configParser

参考&#xff1a;http://www.voidspace.org.uk/python/configobj.html Python模块之ConfigParser - 读写配置文件&#xff1a;http://www.cnblogs.com/victorwu/p/5762931.html Python 官网 configparser 文档&#xff1a;https://docs.python.org/3.7/library/configparser.…

快速排序(c++)

1、快速排序的思想 快速排序就是给基准数据找在数组中正确位置的过程&#xff0c;一旦基准位置的正确位置找到&#xff0c;那基准位置左右两边经过同样的步骤递归也可以有序&#xff0c;最终整体数组有序。 整体可以理解为三个步骤&#xff1a; 1、先从队尾开始向前扫描且当l …

设计模式之禅--思维导图

原图ProcessOn里搜索&#xff1a;设计模式之禅

有BRT,为啥还建公交港湾

原来快速公交和普通公交要一块儿跑历山路公交港湾示意图(制图&#xff1a;赵国陆&#xff09;   “历山路上既然跑快速公交车&#xff0c;有BRT站台&#xff0c;还要公交港湾干吗&#xff1f;”21日&#xff0c;本报报道了新公交港湾将在历山路亮相的消息后&#xff0c;不少市…

2018展望| AI:巨头生态开始站队,深入垂直行业才能赚钱

来源&#xff1a;36氪“AI改变世界”这件事&#xff0c;在2018年会更值得人期待。不只是BAT&#xff0c;京东在谈智能仓储配送&#xff0c;滴滴在谈智慧交通……BAT&#xff0c;以及滴滴、京东这样的小巨头&#xff0c;手中攥着大量数据、也有直接服务消费者的场景&#xff0c;…

归并排序(c++)

归并排序 归并排序&#xff08;Merge Sort&#xff09;是建立在归并操作上的一种有效&#xff0c;稳定的排序算法&#xff0c;该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#x…

五大风口产业全景手绘图(新能源汽车、人工智能等)

来源&#xff1a;一览众车概要&#xff1a;五大风口产业全景手绘图&#xff08;新能源汽车、人工智能等&#xff09;一、新能源汽车二、人工智能三、住房租赁住房租赁产业蕴含着哪些发展机会&#xff1f;各参与方的竞争格局如何&#xff1f;未来人们租房会更便利吗&#xff1f;…

冒泡排序(c++)

冒泡排序&#xff08;Bubble Sort&#xff09; 是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列&#xff0c;依次比较两个相邻的元素&#xff0c;如果顺序&#xff08;如从大到小、首字母从Z到A&#xff09;错误就把他们交换过来。走访元素的工作是重复…

原型模式详解

PrototypeClass.java public class PrototypeClass implements Cloneable {Overridepublic PrototypeClass clone() {try {final PrototypeClass instance (PrototypeClass) super.clone();return instance;} catch (CloneNotSupportedException e) {return null;}} } 1、构…

选择排序(c++)

选择排序 选择排序&#xff08;Selection sort&#xff09;是一种简单直观的排序算法。它的工作原理是&#xff1a;第一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后再从剩余的未排序元素中寻找…

人机交互与智能的思考

来源&#xff1a; 人机与认知实验室概要&#xff1a;在过去的20年里&#xff0c;人工智能一直专注于围绕建设智能体所产生的问题&#xff0c;即在特定的情境下&#xff0c;可以感知并行动的各种系统,在这种情况下&#xff0c;智能是一个与统计学,和经济学相关的理性概念。1.智能…

享元模式详解

SignInfo.java public class SignInfo {/*** 报名人员ID.*/private String id;/*** 考试地点.*/private String location;/*** 考试科目.*/private String subject;/*** 邮寄地址.*/private String postAddress;/*** 获取id.* return the id*/public String getId() {return i…

Python 多进程 multiprocessing 使用示例

multiprocessing 文档&#xff1a;https://docs.python.org/zh-cn/3.10/library/multiprocessing.html Process、Lock、Semaphore、Queue、Pipe、Pool&#xff1a;https://cuiqingcai.com/3335.html 把一个多线程改成多进程&#xff0c;主要有下面几种方法&#xff1a; subpro…

IDC:2018年中国制造业十大预测

来源&#xff1a;先进制造业概要&#xff1a;2017年&#xff0c;中国制造业的竞争日趋激烈。生产成本压力增大以及经济下行趋势迫使中国制造企业的两极分化更加严重。日前&#xff0c;IDC发布了《IDC FutureScape&#xff1a;全球制造业2018预测——中国启示》&#xff0c;报告…

插入排序(c++)

插入排序 插入排序的工作方式像许多人排序一手扑克牌。开始时&#xff0c;我们的左手为空并且桌子上的牌面向下。然后&#xff0c;我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置&#xff0c;我们从右到左将它与已在手中的每张牌进行比较。拿…

Python 操作 redis

官网命令&#xff08;英文&#xff09;列表&#xff1a;http://redis.io/commands Redis 教程&#xff1a;http://www.redis.net.cn/tutorial/3501.html Redis 命令参考&#xff1a;http://redisdoc.com/index.html Windows 中 redis 的下载及安装、设置&#xff1a;https://…

redis调优 -- 内存碎片

最近查看了一下redis运行状况&#xff0c;发现公司测试服务器的redis内存不太够用&#xff0c;但是实际占用内存的数据量其实不大&#xff0c;以前也没有这种情况&#xff0c;之前在cache层新增了一个防刷积分任务的逻辑才会这样&#xff0c;搜索一下原因&#xff0c;发现原来是…