- 1 -
插件式船厂采购系统框架的研究与实现
李何 1,刘杰 2
1武汉理工大学计算机科学与技术系,武汉(430063)
2武汉理工大学能源与动力系,武汉(430063)
摘 要:随着现代化信息环境日趋复杂,各种信息化系统的开发难度随之加大,人们不仅要
重视开发速度,而且要考虑后期的实用性和可维护性。在采购管理客户端系统中,采用
Service Locator模式和抽象工厂模式,能够更好的管理插件对象,从而更加有效降低软件的
耦合度,同时增强软件的复用程序。
关键词:应用框架;插件式;服务定位
中图分类号:TP315
1. 引言
近年来,人们越来越强调软件的设计重用性和系统的可扩展性。从软件结构上来说,插
入式软件开发框架是清晰和灵活的,从开源思想上来说,它能够以最少的代价叠加新功能。
作为一个优秀的开发框架,应该考虑四个方面的问题:1) 数据的展现、录入与编辑以及
页面及组件的布局问题;2) 交互问题;3) 提供后台存储,事务、安全、分布式计算等基础
服务;4) 良好的工具支持,提供所见即所得的可视化设计、拖拽式操作、一体化的操作过
程来提升开发效率[1]。
本文针对 ERP系统开发,提出了在 ERP中应用代码自动生成和插入式开发技术,设计
了基于.net平台下插入式的代码生成框架以及在船厂采购管理系统里面的应用。
2. 应用框架
PSDF(Plug-in Software development frameworks),即插件式软件开发框架,以插件的
形式组织,管理具体应用中的业务逻辑功能组件,由插件接口规范,框架接口规范,插件管
理等部分组成[2],那么 PSDF整体架构如图 1所示。插件管理是最主要的部分,它是沟通插
件接口与框架接口的桥梁 。
图 1 PSDF框架图
插件式框架设计设计需要定义两个标准接口,一个为由平台所实现的平台扩展接口,一
- 2 -
个为插件所实现的插件接口。这里需要说明的是:平台扩展接口完全由平台实现,插件只是
调用和使用,插件接口完全由插件实现,平台也只是调用和使用。平台扩展接口实现插件向
平台方向的单向通信,插件通过平台扩展接口可获取主框架的各种资源和数据,可包括各种
系统句柄,程序内部数据以及内存分配等。插件接口为平台向插件方向的单向通信,平台通
过插件接口调用插件所实现的功能,读取插件处理数据等。
基于插件软件系统的主要优点:1) 实现真正意义上的软件组件的即插即用:2) 是在二进
制级上集成软件,减少大量的软件重新编译与发布的时间和工作量;3) 能够很好实现软件模
块的分工开发,能够大量吸取别人的优点;4) 可较好实现代码隐藏,保护知识产权[3]。
插件软件设计步骤包括:
1) 确定平台基本功能和插件要完成系列化功能或扩展功能;
2) 定义平台扩展接口和插件接口;
3) 完成平台设计,主要是平台插件处理功能;
4) 向插件开发者提供主平台程序(执行代码),公布平台扩展接口和插件要实现的接口,
可能包括开发用的 SDK;
5) 插件开发者按要求开发插件,实现插件接口,开发者可使用提供的主平台程序测试插
件;
6) 主平台设计者继续完成主平台的内核功能,并可随时公布新增加主平台扩展接口和插
件接口;
7) 实现 4-6步骤的良性循环,整个软件系统不断向前进化。
3. 实现技术
NET的反射原理
在.NET平台下实现插件式应用框架, 其基本原理是利用.NET 平台的反射技术。反射可
定义为由一个编程系统提供的一种功能, 此功能使程序员可以在无需提前了解其标识或正
式结构的情况下检查和操作代码实体(一般是程序集) 。以反射为中心的任务分为两类: 检查
和操作[4]。
(1) 检查: 分析对象和类型, 以收集有关其定义和行为的结构化信息。
(2) 操作: 利用通过检查收集到的信息动态地调用代码, 创建已发现类型的新实例, 或者
甚至可以轻松地动态重新结构化类型。
插件为应用程序提供服务有两种方式,1) 直接再应用程序接口中声明属性或者方法;
2) 将应用程序接口声明成一个服务容器。明确的功能就在接口中直接声明成属性或者方法,
另外将应用程序声明成一个服务容器,以方便插入更多的服务功能,提高应用程序的可扩展
性。
在.net平台下,ServiceContainer 是.net提供的 IserviceContainer 的实现,如果没有特殊
的需要,不必扩展它,而是直接的利用它。在实现 IApplication 接口的时候就直接使用的
ServiceContainer。在使用 Service架构的时候,总是倾向于有一个根容器,各个 Service容器
构成了一个 Service容器树,每一个节点的服务都可以一直向上传递,直到根部,而每一个
节点请求 Service的时候,我们总是可以从根节点获得。把这个根节点比喻成一个服务中心,
它汇总了所有可提供的服务,当某个对象要请求服务(GetService)只需要向根结点发送要
获得的服务,根结点就可以把服务的对象传递给它。
- 3 -
代码自动生成技术
代码自动生成技术主要有以下三种
1) 手写生成代码。即只能通过手写代码来生成代码,例如生成一个按钮控件,可以使
用 Button button1=new Button();
2) 利用模板生成技术实现。在.net中有代码文档对象模型(Code Document object Model
CodeDom)技术. 名称空间包含了许多以语言中立的形式描述常见程序结
构的对象,每一种语言的细节则由与该种语言对应的 CodeProvider 对象负责处理。这种方
式就不必计较是生成何种具体语言。
3) 利用 XSLT 技术实现。该方法构造一种系统自己的模板语言,使用 XML 描述其文
法。XMLShcema 语言是利用可应用到一类 XML文档上的规则或结构模块来进行形式化约
束的语言。其优点是文法描述的直观性,避免了编写繁琐而易错的文法文件。这种方法的缺
点是依托于某门编程语言,受编程语言的限制[5]。
4. 插件式框架设计实现
插件应用框架的设计模式
让宿主程序更好的调用插件服务功能,实现宿主程序和插件之间的低耦合,是插件式开
发框架的一个重点,而 Service Locator提供了一个较好的解决方式。它将所有对接口和插件
的依赖和实现都抽象到服务定位类里面,使用服务定位器对象来实现对接口的调用,隐藏了
复杂的初始化创建过程。
如下图 2 所示,Assembler 类负责创建接口 IService 的实现类 ServiceImplement,并将
ServiceImplement载入到 Service Locator这个容器类中。当 Client向 Service Locator发出服
务请求时,Service Locator根据 Client的请求,查找满足条件的 ServiceImplement对象,并
将 ServiceImplement对象返回给 Client。Client只依赖于 Service Locator和 IService接口,而
不需了解 IService背后的实现是什么。这种设计模式更加趋向 SAAS模式,即软件就是作为
服务。
图 2 Service Locator模式
- 4 -
界面插件生成的解决方案
在企业信息化系统的开发过程中,涉及最多的就是对数据库表中的数据的浏览,修改,
显示和删除等操作。为了能够加快应用程序的开发过程,可以建立一个主窗口的页面如下图
所示上面是菜单栏,数据显示区,应用程序导航栏。应用程序导航栏对应着数据库中表的应
用,针对每一项应用,可以采用分页控件,在数据显示区的表格控件中打开数据库表的数据。
系统整体上采用插件式,由主程序框架调用每个具体应用的 dll 文件(这个 dll 文件可大可
小,不局限于一个应用的窗体)。
插件式开发的步骤:
1) 主窗口的功能基本上就是能够显示不同应用的数据,没有其它过多的事件产生。
2) 子窗口的创建问题。本文提出在后台建立一个代码自动生成的公共函数,通过以下
的数据信息,能够自动生成一个子窗口,那么在.net 平台那么它就是以.vb 或者.cs
结尾的文件。其中每个控件的响应事情写成一个.dll 文件,当触发事件时,调用其
中的属性或者方法,这样就可以真正的到达用户界面和代码的分离。用户控件的代
码自动生成,实现技术里面已经有的介绍,可以根据具体情况进行具体实现。
表 1 字段-控件类型对应表
字段名 字段类型 控件类型 控件坐标 控件长度 控件高度
3) 文件的编译。在.net平台下,除了可以通过建立类库项目自动编译成.dll文件以外,
只要安装了.net framework,也可以通过编译语句来进行编译。同时为了能够快捷的
编译,则将编译语句放在一个.bat 文件中,当子窗口建立的同时,调用此文件进行
编译。如下语句即可以编译:
csc /target: library /out: *.cs
此语句的意义是将窗体文件编译成动态链接库。
4) 插件的装载。.net 平台下,插件的加载使用 Assembly。如何实现动态加载呢?这个
时候就需要用到反射(Reflection)机制。使用 Assembly的 GetTypes静态方法来得
到 Assembly里所包含的所有的类型,然后遍历所有的类型并判断每一个类型是不是
从 IPlugin 接口派生出来的,如果符合条件,则可以使用 Activator 的静态方法
CreateInstance方法来获得这个插件的实例。插件装载的步骤如下代码所示:
Assembly assembly = (pluginFilePath);
//得到 Assembly中的所有类型
Type[] types = ();
//遍历所有的类型,找到插件类型,并创建插件实例并加载
foreach (Type type in types)
{
if (("IPlugin") != null)//判断类型是否派生自 IPlugin接口
{
IPlugin plugin = (IPlugin)(type);//创建插件实例
= this;
();
}
}
以上就是插件式的代码自动生成的主要核心思想。这么做的好处就是如果数据库表的字
- 5 -
段发生变化之后,不影响代码生成的进程。采用插件式的方式,可以使得应用程序的代码量
变少。当然,窗口的自动生成当然会耗时和资源,本框架也提出,当用户对窗体界面的布局
没有什么意见时,可以将子窗口文件进行创建成保存文件,那么以后就不需要每次都进行代
码自动生成。
5. 基于插件技术的船厂信息系统的应用实例
下面以船厂设备管理系统的采购管理客户端来实践,来探讨插件式系统的开发流程。
需求分析
在船厂信息系统里面,设备管理是一个很重要的部分。船厂设备的主要功能有设备设
施管理,采购管理,工具管理,外包管理,数据库基本信息管理五个主要模块。采购部门需
要向上级部门申报所需要的材料信息,然后有上级部门来审批。
那么采购管理客户端的用户有一下功能:
1)读取实时设备的价格表,使用情况,剩余量等信息
2)完成采购设备信息的创建,填写,修改
3)能够统计分析设备的使用情况,以对采购数量有实际参考价值
4)将采购申请信息资料上传
5)读取各种报表
6)进行适当的权限设置,来确定用户是否有权限申请设备采购和使用
7)在成功购置设备后,可以对合同进行管理
采购管理采用 C/S 模式,操作更加简单,快捷,同时能够很好的保证数据的安全。使
用插件是开发模式,使得采购客户端有很好的扩展性。
系统总体结构
根据插件开发流程,将插件分为以下几个部分:
1)用户登陆插件:使用单件模式,在用户第一次登陆系统的时候,加载用户登陆插件。
2)界面插件:在前面所讲述的界面生成方案中,将其封装成一个插件,以供其它插件使用
3)设备申请单插件:将设备申请的处理封装在一个插件里面,通过订制服务来加载到宿主
程序中,提高软件的复用性。
4)基础功能插件:空间数据库操作插件,包括数据库的连接,查看,修改,删除等;数据
库实体类插件,能够使用数据库操作插件,提供一个业务逻辑层,以供界面端使用;上传下
载操作插件,将所有申请内容快速可靠的传输到网络上。
如下图 3所示,以采购管理主程序作为一个 Client来调用插件服务接口类的服务方法,
其中程序启动类相当于一个命令,来表明宿主程序需要调用那些服务插件,即读取一个
config配置文件。插件工厂通过实例化插件服务接口类。将插件分为两个层级:基础功能插
件和高级功能插件。高级功能插件可以调用基础功能插件所提供的基本功能,例如数据库连
接,界面元素的生成以及数据库处理类。采购管理主程序只与插件服务接口进行通信,降低
了软件的耦合度,提高软件的可复用性。
- 6 -
图 3 采购系统插件式开发总体架构
加载用户登陆插件
以下就是设备管理用户加载登陆插件的流程,主要分为两个部分,一个插件的加载和
服务定位。
第一步:程序启动类读取配置文件信息,获取登陆插件的信息。插件服务接口类创建登
陆插件,实际插件的创建工作由插件工厂具体实现。将服务接口类的信息写到临时配置文件
中,然后将此插件在插件服务容器中注册
第二步:设备管理用户从插件服务容器中获得登陆插件的实例。登陆插件由一个浮动窗
体显示。
如下图 4为登陆插件场景加载流程。
图 4 登陆插件场景加载流程
6. 结束语
在插件式软件开发框架中,关键问题是分析平台的基本功能和可扩展的插件功能。此
框架中使用插件开发技术和代码自动生成技术,为应用程序开发开辟一条新的解决方式,能
- 7 -
有效的提高开发的速度。在插件开发部分,采用了服务定位模式,同时在插件的定位部分采
用抽象工厂的模式,有效降低了软件的耦合度。
参考文献
[1]李俊娥,周洞汝.“平台/插件”软件体系结构风格[J].小型微型计算机系统,.
[2]Xin Chen.应用框架的设计与实现——.NET平台[M].北京:电子工业出版社, :25-30.
[3]张进军 ,张维勇 ,薛来文 .一种基于插件的软件体系结构 [J].合肥工业人学学报 (自然科学
版),2005,28(4):398-401.
[4] Mike Repass 反射之反思.
[5] KATHLEEN DOLLARD. Code Generation in [M].
Research and Implement in Plug-in framework of
purchasing system
Li He1, Liu Jie2
1. Computer Science and Technology, Wuhan University Of Technology,Wuhan,
China(430063)
2. School of Energy and Power Engineering, Wuhan University Of Technology,Wuhan,
China(430063)
Abstract
With the increasingly complication of the modern information environment, the difficulty in
developing ERP is increasing. Meanwhile, people do emphasize the speed of programming
development and the practicability and maintainability in the upper time. In the purchasing
management system, the use of Service Locator pattern and the abstract factory pattern can improve
management of plug-in objects, in order to more effectively reduce the coupling degree of software,
while enhancing the process of software reuse.
Keywords: framework; plug-in; Service Locator
作者简介: 李何(1985),女(汉族),湖北麻城人,在读硕士,主要研究方向:计算机支
撑技术。研究生期间在武汉理工大学能源与动力工程学院可靠性工程研究所和“船舶动力系
统运用技术”交通行业重点实验室学习工作。