前天发了构建插件式的应用程序框架(五)----管理插件这篇文章,有几个朋友在回复中希望了解插件之间是如何通讯的。
这个系列的文章写到这里,也该谈谈这个问题了,毕竟已经有了插件管理。不知道大家有没有注意到我在第四篇文章里谈到的服务容器(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))来得到文档服务的实例,接着我们就可以使用这个实例来完成某项功能,比如添加一个新文档等等,其实在第五篇文章的源代码就有这样代码:

private void CheckExistedPlugin()
        {
            IPluginService pluginService = (IPluginService)application.GetService(typeof(IPluginService));
            if (pluginService != null)
            {
                List<String> nameList=new List<string>();
                String[] pluginNames = pluginService.GetAllPluginNames();
                nameList.AddRange(pluginNames);
                foreach (ListViewItem item in listView1.Items)
                {
                    if (nameList.Contains(item.Text))
                    {
                        item.Checked = true;
                    }
                }
            }
        }

当然,要在插件中获得实例,你必须在应用程序里或者其他插件里实例化服务对象,然后添加到服务容器里,还拿上边的例子,我们在应用程序里实例化了PluginService,然后添加到了容器里,代码如下:

        public MainForm()
        {
            InitializeComponent();
            pluginService = new PluginService(this);
            serviceContainer.AddService(typeof(IPluginService), pluginService);
        }

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

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

  1. 构建插件式的应用程序框架(四)----服务容器

    在构建插件式的应用程序框架(二)----订立契约一文中,可以看到我们的IApplication接口是派生于IServiceContainer接口的.为什么要派生于IServiceContainer呢? ...

  2. 构建插件式的应用程序框架(一)----开篇

         说起插件(plug-in)式的应用程序大家应该不陌生吧,记得很早以前有一款很流行的MP3播放软件winmap,它是我记忆里最早认识的一款使用插件模式的应用程序,你可以使用他的插件管理器插入很 ...

  3. 构建插件式的应用程序框架(八)----视图服务的简单实现(ZT)

    我在前一篇文章里提到,对于停靠工具栏或者是视图最好是不要将实例放到词典中,而是将工具栏或者视图的类型放到词典中,因为视图类型会经常的被重用,并且会经常被关闭或者再打开.当实例被关闭后,资源就被释放了, ...

  4. 用于构建集成式桌面应用程序的新指南和新工具(转载于MSDN)

    发布日期: 2006-10-30 | 更新日期: 2006-10-30 Christian Thilmany 和 Jim Keane 本文将介绍以下内容: • CAB 和 Smart Client S ...

  5. .net 插件式开发学习总结

    .NET简谈插件系统开发模式 今天跟大家分享一下我们在日常开发中并不常用的开发模式"插件系统模式",什么叫插件从大一点的概念讲就是我们开发的软件是由很小的模块组成,每一块都能成功的 ...

  6. 插件式架构设计实践:插件式系统架构设计简介

    本系列博文将使用微软RIA技术解决方案Silverlight以及扩展性管理框架Managed Extensibility Framework(MEF),以插件式架构设计为导线,分享本人在从事基于微软S ...

  7. springboot 前缀_springboot插件式开发框架

    springboot插件式开发框架 介绍 该框架主要是集成于springboot项目,用于开发插件式应用的集成框架. 核心功能 插件配置式插拔于springboot项目. 在springboot上可以 ...

  8. Seam - 无缝集成 JSF,第 1 部分: 为 JSF 量身定做的应用程序框架

    Seam - 无缝集成 JSF,第 1 部分: 为 JSF 量身定做的应用程序框架 发现 Seam 对 JSF 生命周期特有的增强 文档选项 未显示需要 JavaScript 的文档选项 打印本页 将 ...

  9. 9. Zigbee应用程序框架开发指南 - 属性管理

    1 Zigbee应用程序框架开发指南 - 概述 2 Zigbee应用程序框架开发指南 - 应用程序框架结构 3 Zigbee应用程序框架开发指南 - 应用程序框架目录结构 4 Zigbee应用程序框架 ...

最新文章

  1. python multi_python – 堆叠MultiIndex的所有级别
  2. 另一个小程序 返回的支付结果如何得到_手把手教你测微信小程序
  3. 快速搞懂ThreadLocal实现原理
  4. 计算机键盘标注,你所不知道的 Windows 10 小诀窍:万能计算器、虚拟键盘、屏幕截图标注...
  5. 动态规划(6)——NYOJ469擅长排列的小明II*
  6. android 组件化_你曾遇到的某大厂奇葩问题:Android组件化开发,组件间的Activity页面跳转...
  7. ResNet网络简单理解与代码
  8. 有关一级域名二级域名三级域名
  9. 以新发展理念引领新型智慧城市建设
  10. java 集成 pageoffice 实现 word 文档的在线编辑以及流转
  11. 携程,京东,4399静态页面总结
  12. 自制一个简单的音乐播放器
  13. VPN --- (虚拟专用网) 详解
  14. Exiting intel PXE ROM.Operating system not found
  15. ABP 源码学习随笔
  16. openamp RPU-APU双核间通信 建立多个通道
  17. [USACO 2007 Jan S]Protecting the Flowers
  18. 行之有效:第一章观后有感
  19. DHT11 模块的使用
  20. 凡科自建网站有服务器吗,如何搭建网站服务器,有什么步骤?

热门文章

  1. 在HTML网页中巧用URL
  2. 提高C++性能的编程技术笔记:内联+测试代码
  3. OpenCV中基于LBP算法的人脸检测测试代码
  4. OpenCV代码提取:flip函数的实现
  5. C/C++中inline/static inline/extern inline的区别及使用
  6. Windows7中搭建Android x86_64及armv8-a操作步骤
  7. java redis释放连接池_Java 使用连接池操作redis
  8. java 跨年 周计算公式_如何跨年计算 两日期之间相隔的周数 with java8 time API
  9. jQuery 一次定时器_干货 | 小论定时器玩法(时间轮询法)
  10. docker 离线安装 mysql_Oracle数据库之docker 离线环境安装oracle