插件架构学习体会(三)--插件:兄弟们要团结

插件和宿主程序之间的相互通讯都不是什么问题了,那插件之间的相互通讯呢?理论上来说,插件之间的相互通讯是比较少见的,因为他们之间的通讯势必造成插件之间的依赖关系,那么对加载顺序也就有了严格的要求,我们应该尽量避免这种依赖。话说回来,如果需要插件间通讯,我们该如何做,不难想到,既然插件和宿主可以相互通讯,那我们只要让宿主做插件的中间人,就可以把两个插件联系在一起,毕竟宿主可以持有插件的引用。按照这个思路,继续修改程序:
    首先我们得让宿主程序保存已加载插件的引用,并能获取制定的插件引用,修改一下IAppContext接口,添加以下内容


 //宿主程序需要保存所有插件的信息,以插件可以相互获得其他插件的引用
        void AddService(string pluginName, IPlugIn plugin);
        void RemoveService(string pluginName);
        IPlugIn GetService(string pluginName);

    接下来要在宿主中实现这些接口了


        //用来保存插件引用的列表
        private Dictionary<string,IPlugIn> _Services = new  Dictionary<string,IPlugIn>();
        public void AddService(string pluginName, IPlugIn plugin)
        {
            this._Services.Add(pluginName,plugin);
        }
        public void RemoveService(string pluginName)
        {
            this._Services.Remove(pluginName);
        }
        public IPlugIn GetService(string pluginName)
        {
            IPlugIn plugin= null;
            if(this._Services.TryGetValue(pluginName,out plugin))
                return plugin;
            else 
                return null;
        }

    这样在load插件的时候,把插件的引用保存起来AddService(plugin.ToString(), plugin),新建一个插件,在新插件中可以通过宿主的GetService()方法获取指定插件的引用,代码如下


        //实现了contract里约定的方法,控制台上输出宿主程序的属性TextOut字符串
        public void PrintToConsole()
        {
            IPlugIn plugin = m_App.GetService("ASimplePlugIn.PrintHelloWorld");
            if(plugin==null)
                Console.WriteLine("please load plugin named ASimplePlugIn first");
            else
                plugin.PrintToConsole();
        }

    结果如下:

代码下载:http://files.cnblogs.com/Pcant/SimplePlug-in3.rar

时间: 2024-10-30 08:37:57

插件架构学习体会(三)--插件:兄弟们要团结的相关文章

插件架构学习体会(一) -- 宿主程序说:插件你得听我的

  看了一段时间的#develop,首先接触到的就是程序的插件架构.园子里也有许多不错的资料可以学习.随时把自己的认识写下来和大家交流,无疑会有很大帮助.闲话就不说了,进入正题.     说到插件架构,首先要有一个整体印象,到底什么才是插件架构?这个问题的答案很好找,找个插件架构的程序看看就可以了,比如VS,MyIE,再比如千千静听.我们可以开发不同功能的插件,加载到宿主程序上,功能就能发挥作用.宿主程序呢,完全不知道我们到底什么样的功能,怎么实现的.这里呢,我想从我们平常写程序时引用一些类库说

插件架构学习体会(二) -- 插件程序说:要求平等对话

在上一篇中我们知道,宿主程序对插件程序定义了一个规约,以此达到和插件程序通讯的目的.那插件有些不平衡,有时候我也需要知道你宿主程序的一些信息来完成我的工作,因此,我必须和你通讯,要有对话的权利.实际上,插件一般都会或多或少的用到宿主程序的上下文,比如vs插件,需要获取vs环境中的编辑的代码对象,才能完成它的工作比如格式化啊统计啊,再比如播放器的歌词插件,至少要获取播放器正在播放的是哪首歌吧.那么我们如何来实现这个通讯呢?我们知道宿主通过一个接口来操作插件,那么同理,插件可以通过一个接口来操作宿主

ABP架构学习系列三:手工搭建ABP框架

由于公司的项目才接触到ABP这个框架,当时就觉得高大上,什么IOC.AOP.ddd各种专业词汇让人激情 澎湃,但在使用过程中碰到了许多坑,可能也许是没有去看源码导致的,但工作确实没有那么多时间让人去慢慢研究.很久之前想手动搭建这个框架了,但是各种理由,你懂的.但是要在技术上得到大的提升就得静的下心去研究,学到大神的思想和精髓,运用到实际中去,才能去体验更开阔的天地. 本文以创建博客为思路,一步步构建整个项目,在摸索中进步,也希望能够帮助到有需要的人. 一.基础架构 第一部分主要是搭建好整个项目的

ABP架构学习系列一 整体项目结构及目录

本系列是基于aspnetboilerplate-0.8.4.0版本写的,其中原因是由于较高的版本太抽象难以理解和分析,对于还菜菜的我要花更多的时间去学习. abp的源码分析学习主要来源于 HK Zhang ,他的博客是https://www.cnblogs.com/1zhk/ 一.什么是ABP ASP.NET Boilerplate(ABP)是现代新的Web应用程序的最佳实践和最流行的工具的起点.它的目标是实体模型.通用应用程序框架和项目模板. ABP是一个建立在最新的ASP.NET的MVC和W

python 优雅地实现插件架构

近日,决定用 python 实现插件架构,于是上 stackoverflow 逛了一下,在这里发现一段代码,非常喜欢. 提醒各位大侠注意,我对这段代码作了一点小小的改动:原 PLUGINS 是 list 对象,改动后 PLUGINS 是 dict 对象. 代码先贴出来,以飨观众: ''' 插件架构 ''' # 平台 class TextProcessor(object): PLUGINS = {} def process(self, text, plugins=()): if plugins i

Sublime 插件自定义学习

用了sublime很长时间了,感觉这个IDE确实不错,简约而不简单 记的之前用webstorm的时候,每当新建html页的时候,系统总会自动的填充一些骨架代码,但是用sublime的时候,新建html文件的时候,系统不会自动填充,所以 我想用sublime插件机制,自动填充骨架代码. sublime提供了灵活的插件扩展机制,下面提供一个完整的自动填充html骨架代码的小插件,纯当练手:) 1.创建自定义插件代码 点击Tools菜单下的New plugin..,系统会自动生成一个插件的基本模板,代

typecho插件编写教程(三):保存配置

  这篇文章主要介绍了typecho插件编写教程(三):保存配置,本文讲解了完善方法.如何保存配置.使用需要注意的问题等内容,需要的朋友可以参考下 上一节我们制作了一个裸插件,下面我们开始让我们的插件开始工作! I. 完善方法 两个方法 我们实现activate和deactivate方法 代码如下: public static function activate(){ return 'activate'; } public static function deactivate(){ return

最新版本的eclipse安装 aptana插件为了学习jquery 和js用的

问题描述 最新版本的eclipse安装 aptana插件为了学习jquery 和js用的 为什么我使用手工的方法在eclipse 目录下新建一个文件夹,,,,,,,然后link文件夹,,,,打开后不可用 解决方案 参考开发 " rel="nofollow">Eclipse 离线link方式安装 Aptana Studio 3 插件来支持javascript.html.css.jquery开发 如果还不行的话,回复一下 解决方案二: 只是学习js和jQuery,为何不用强

分享jQuery插件的学习笔记_jquery

插件(Plugin)也成为 jQuery 扩展(Extension),是一种遵循一定规范的应用程序接口编写出来的程序.目前 jQuery 插件已超过几千种,由来自世界各地的开发者共同编写.验证和完善.而对于jQuery开发者而言,直接使用这些插件将快速稳定架构系统,节约项目成本. 一. 插件概述 插件是以 jQuery 的核心代码为基础,编写出复合一定规范的应用程序.也就是说,插件也是 jQuery 代码,通过 js 文件引入的方式植入即可. 插件的种类很多,主要大致可以分为:UI 类.表单及验