前天发了
构建插件式的应用程序框架(五)----管理插件这篇文章,有几个朋友在回复中希望了解插件之间是如何通讯的。
这个系列的文章写到这里,也该谈谈这个问题了,毕竟已经有了插件管理。不知道大家有没有注意到我在第四篇文章里谈到的服务容器(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);
}
稍后,我会继续完善这个例子,做一个简单的多文档编辑器来做演示,并提供一些基础的服务,以便大家阅读。
分享到:
相关推荐
Qt是一个强大的跨平台应用程序开发框架,广泛应用于GUI设计和系统集成。QGenericPlugin是Qt提供的一种插件系统,允许开发者创建可动态加载的插件,增强软件的灵活性和可扩展性。 首先,我们需要了解QGenericPlugin...
2. 通讯机制:DLL与主框架之间的通讯通常通过接口或消息传递来实现。接口定义了一组函数调用,供主程序调用DLL中的功能。消息传递则可以通过发送自定义消息或者使用事件驱动的方式,使得DLL能够通知主程序其状态变化...
7. **文档和资源**:`构建插件式的应用程序框架目录.doc`可能包含了详细步骤和指导,帮助开发者理解如何构建这样的框架,包括目录结构、文件组织和最佳实践。而`PluginSystem.rar`可能是一个示例插件系统或库,包含...
Qt是一个强大的跨平台应用程序开发框架,尤其在GUI设计方面表现出色。它提供了一种灵活的插件系统,允许在运行时动态加载和卸载模块,使得软件具有高度可扩展性。本文将围绕信号与槽机制,这一Qt的核心特性,来解释...
4. **通讯机制**:System.Addin框架提供了跨进程的通讯机制,确保插件和宿主之间数据的安全传递。 5. **安全与隔离**:插件运行在单独的AppDomain中,这样即使插件出现问题,也不会影响到宿主和其他插件,保证了系统...
Netty作为一个高性能的网络应用框架,被广泛应用于构建高性能的网络服务器和客户端程序。在此项目中,Netty被用来构建一个即时通讯框架——B-IM,它是一个用Java语言实现的即时消息系统。B-IM的设计和实现不仅包含了...
uni-app是一个跨平台的前端开发框架,它允许开发者使用一套代码库,构建出能在iOS、Android、微信小程序、H5等多个平台运行的应用。在实际项目中,有时我们需要在uni-app创建的小程序与网页之间实现数据交互或功能...
首先,QT(Qt)是一个开源的C++图形用户界面应用程序框架,由挪威的Trolltech公司开发,后被诺基亚收购并继续发展,现由The Qt Company维护。QT平台允许开发者使用统一的编程接口来创建跨多个操作系统和硬件平台的...
### Vue3-WeChat-App框架:现代化微信小程序开发新选择 #### 桢架特点 **1. Vue3 驱动** - **Composition API**:Vue3 引入了 Composition API,使得开发者能够更好地组织和重用逻辑,提高了组件的可读性和可维护...
"软件/插件"可能暗示这个记忆测试系统既可以作为一个独立的应用程序运行,也可能设计为可以集成到其他软件中的插件。"测试"标签则表明该系统可能包含测试框架和自动化测试脚本,用于确保代码质量、功能正确性以及...
• 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • 集成的浏览器 基于开源的 WebKit 引擎 • 优化的图形库 包括定制的 2D 图形库, 3D 图形库基于 OpenGL ES 1.0 ...
Windows Presentation Foundation (WPF) 是Microsoft开发的一个用于构建桌面应用程序的框架,它提供了丰富的用户界面设计能力和强大的数据绑定功能。MVVM(Model-View-ViewModel)是一种设计模式,常用于WPF应用中,...
Qt 4.3 是一个强大且灵活的开发框架,它不仅提供了丰富的工具和组件来帮助开发者构建高质量的 GUI 应用程序,而且还支持多种平台,使得开发者能够轻松地将同一个应用程序部署到不同的操作系统上。通过其独特的信号和...
- **概述**:Struts是一个基于MVC模式的Java Web应用程序框架。 - **特点**: - **模型-视图-控制器(Model-View-Controller)**:将应用程序分为模型层、视图层和控制层,提高了代码的可维护性和可扩展性。 - **...
- 实施监控机制,跟踪应用程序的运行状态。 - 通过邮件、即时通讯等方式向团队成员发送构建状态的通知。 ### 四、案例分析:基于Jenkins实现CICD的具体实践 #### 1. 构建Jenkins环境 - 安装Jenkins服务器,并配置...
首先,文章提出Android应用开发是建立在应用程序框架层的基础之上,开发者通过框架提供的组件进行上层应用开发并与底层系统进行功能交互。Android系统架构包括Linux内核层、系统运行库层、应用程序框架层和应用程序...
Apache MINA是一个高性能和高可靠性网络应用程序框架,基于Java NIO实现,提供了统一的API支持不同的传输类型。它支持SSL/TLS加密,并集成了模拟对象单元测试和JMX管理能力,使得开发高性能网络应用更为容易。 在...
Go-tgo-core是一款基于Go语言开发的现代通讯服务器框架,专为构建高性能、高效率且具有强大扩展性的应用程序而设计。在即时通讯、物联网通讯和AI智能领域,这款框架表现出色,能够满足复杂多变的业务需求。本文将...
WebSocket通讯框架jWebSocket是一个用于构建实时、双向通信应用的开源Java框架。WebSocket协议是HTML5标准的一部分,旨在提供低延迟、高效能的网络通信方式,它允许服务器与客户端之间进行全双工通信,即双方可以...
在信息技术领域,C#是一种广泛使用的编程语言,尤其在微软开发的.NET框架中占据重要地位。C#语言因其易于学习、强类型特性以及对面向对象编程的支持而受到许多开发者的青睐。CAN通讯,即控制器局域网络通讯,是一种...