使用存储工厂构建区域协同医疗信息系统遇到的问题及解决方法

2012-11-16 03:42于冬
中国医疗设备 2012年5期
关键词:病员信息系统实体

于冬

内蒙古巴彦淖尔市医院 计算机中心,内蒙古 巴彦淖尔 015000

使用存储工厂构建区域协同医疗信息系统遇到的问题及解决方法

于冬

内蒙古巴彦淖尔市医院 计算机中心,内蒙古 巴彦淖尔 015000

在我国新医改不断推进的大环境下,区域协同医疗从未变得如此重要,而另一方面,医院信息系统反而在最初就被设计成为一个孤立王国。本文全面描述了如何使用存储工厂在医院信息系统外面包裹一层数据访问层,在二者之间形成一个坚实的纽带促进它们的融合,并聚焦于该应用的很多特定场景,与同行分享解决这些棘手问题的经验。

存储工厂;区域协同医疗;医院信息系统;数据访问层

0 前言

随着新医改的不断深入和发展,实现医院间医疗资源与信息资源的整合共享越来越成为大势所趋,而最初开发的医院信息系统(HIS)基本是基于本医院层面的,各自为政,从而产生了形形色色的信息孤岛,导致无法实现医院间的双向转诊,最终导致重复医疗,重复检查的情况,大大浪费了宝贵的医疗资源。近年来,区域协同医疗以区域为突破点,整合区域内各医院层面的信息系统,通过卫生信息数据库和信息平台,在实现百姓就医预约制、看病一卡制、病历终身制上取得了长足的进步,为最终建立全社会的“公共服务信息平台”进行了很多有意义的探索[1]。

为了适应区域协同医疗的需求,必须对现有封闭式的HIS进行改造,使其具有标准化的数据访问接口以进行一致的数据交换。在软件设计层面,必须引入经过验证的、可重用的、可维护的、松耦合的应用软件系统[2]。存储工厂(Repository Factory)本身作为一个轻量级的代码生成器,以自动化的方式从现有的数据模型创建业务实体,并生成数据访问逻辑的存储类和工厂以及数据库服务器端的存储过程,这是微软模式与实践小组推荐的在既有系统上构建标准化数据访问接口的实现模式。

1 存储工厂的作用和功能

存储工厂不是一个对象-关系映射(Object-Relational Mapping,ORM)工具,它其实是一个轻量级的代码生成器,主要作用和功能就是自动生成对现有数据库访问技术中最关键的领域模型对象(domain model object),并将其持久化为数据库的任务代码。这点表明它本身不是一个建模工具,而是在已经建立好的模型上额外构建一层标准的数据访问接口,这就相当于HIS这个自由王国主动展示出欢迎外界来访的姿态,而且规范了如何访问的标准,所以存储工厂非常适合我们在现有的HIS上进行改造,它对现用的旧有系统的使用不产生任何影响,而新开发的系统都将构建在这个标准的数据库访问层上,符合积累量变最后达到质变的软件进化的观点。

2 存储工厂的使用

存储工厂目前已经交由开源社区CodePlex进行开发,最新的版本Build31651可以从http://www.codeplex.com/RepositoryFactory这个主页上下载[3]。下面我们将简述存储工厂的使用过程,具体内容大家可以参阅相关资料和网页[4]。

2.1 启用存储工厂

我们使用的集成开发工具为Visual Studio 2008,具体操作步骤如下:

在“工具”菜单中选择“Guidance Package Manager(向导包管理器)”打开向导包管理器,点击“Enable/Disable Packages…(启 用 /禁 用 向 导 包 …)”, 勾 选“Repository Factory MAR 2009(存储工厂2009年3月发布版)”,点击“确定”,启用存储工厂成功。

2.2 指定项目的责任

存储工厂在生成代码时将其内部按照功能不同划分为3个项目层,分别为:业务实体项目、数据访问项目、宿主项目,我们必须将解决方案中的项目映射到这3个项目层上,具体操作步骤如下:

在对应项目的右键菜单上,选择“Specify project responsibility(指定项目职责)”,勾选对应的项目类型:Business Entities Project(业 务 实 体 项 目 )、Data Access Project(数据访问项目)、Host Project(宿主项目)。

2.3 添加数据库连接

存储工厂可以为当前主流的企业级数据库生成连接,包括SQL Server以及Oracle,具体的操作步骤如下:

在宿主项目的右键菜单上,选择“Add SQL Server database connection(加入 SQL Server 数据库连接 )”、“Add Oracle database connection(.NET Framework)(加 入Oracle数据库连接—针对.NET架构)”、“Add Oracle database connection(ODP.NET)(加入 Oracle 数据库连接—针对ODP.NET)”,输入连接名和连接字符串。

2.4 创建实体类

存储工厂将创建对应于数据库中表的业务实体类,用于将数据表中的内容持久化到根据实体类模板创建的实体对象中,创建实体类的具体操作步骤如下:

在业务实体项目的右键菜单上,选择“Create business entities from database(从数据库中创建业务实体)”,选择宿主工程中刚才创建的连接字符串进行数据库连接,设置默认的命名空间,然后选择表、视图、字段,设置或者修改各个实体的属性和数据类型,点击完成后会自动生成业务实体的代码。

2.5 创建CRUD存储过程

存储工厂将为我们创建对应数据库访问的CRUD(Create、Retrieve、Update、Delete)操作的存储过程脚本,大大简化了繁琐枯燥的编码工作,具体操作步骤如下:

在数据访问项目的右键菜单上,选择“Create CRUD Stored Procedures(创建CRUD存储过程)”,选择对应的数据表,存储工厂可以创建Insert、Update、Delete、GetAll、GetOne、GetMany等6种类型的存储过程。

2.6 创建数据存储

存储工厂将根据业务实体创建数据存储类,其中,创建的很多方法是真正让数据流动起来的载体,是存储工厂所创建代码的核心部分,具体操作步骤如下:

在数据访问项目的右键菜单上,选择“Create data repository classes from business entities(从业务实体中创建数据存储类)”,选择之前生成的业务实体,指定实体和存储过程之间的映射关系,还可以进一步指定实体属性和存储过程参数之间的映射关系,点击完成后将生成数据存储的代码,其中,包括Repository接口和实现以及分别针对每一种操作生成的一个工厂类。

2.7 使用生成的数据存储和访问代码

我们现在可以创建存储工厂类的一个实例对象来进行具体的数据访问操作了,具体代码如下:

3 实践中遇到的难题与求解

有了这样一个好的架构和开发工具,很多人都想当然地认为应用起来一定会一帆风顺,其实不然,实践中仍然存在着巨大的技术风险和陷阱。在使用这项新技术之前,我们首先对该技术进行了预研,即对该项创新技术通过集体智慧进行整体研判,然后通过精心设计的场景进行仿真模拟实验,循序渐进地进行了多项集中公关,最终才确认了该创新技术应用的可行性及技术方案的准确性。下面是我们聚焦存储工厂在实际开发中遇到的一些难题,与各位开发者分享我们的求解过程及最终的解决方案。

3.1 升级存储工厂引用企业库版本

存储工厂本身建构在企业库3.1的版本上面,但由于我们整体的解决方案(Solution)是建构在最新的企业库4.1的版本上面,虽然.NET技术允许程序集(Assembly)不同版本同时存在,但是这样会造成将来的软件系统部署的复杂性,意味着在一个系统中必须同时部署企业库3.1和4.1版本,而且要保证配置文件对程序集引用的正确性,在软件设计和可维护性方面也将是易出错的,一旦发生引用错误,往往会出现莫名其妙的结果,严重影响开发和维护人员对错误的判断力和排除错误的效率[5]。

解决的办法是:由于存储工厂是开放源码的,我们通过修改源码,升级其引用企业库的版本到4.1。我们将C: epositoryfactory-31651TrunkSourceLib目录下的企业库程序集Microsoft.Practices.EnterpriseLibrary.Common.dll Microsoft.Practices.EnterpriseLibrary.Configuration.Design.dll Microsoft.Practices.EnterpriseLibrary.Data.dll 升级到企业库4.1版本的同名文件,Microsoft.Practices.ObjectBuilder.dll升级为企业库4.1版Microsoft.Practices.ObjectBuilder2.dll。然后将解决方案LibrariesSchemaDiscoveryDbSchemaProviderFactory.cs文件中的语句using Microsoft.Practices.ObjectBuilder;改为using Microsoft.Practices.ObjectBuilder2;重新建立整个解决方案,升级成功。

3.2 返回数据库生成新插入数据行的主键。

由于特定的数据表本身存在唯一性约束的要求,具体到现实业务中的一个例子就是在病员新入院时,我们需要根据特定的规则为该病员生成一个唯一标识,即所谓的住院号,为了保证这个标识不会重复,必须由数据库端来生成,然后返回到前台用于显示、打印异或后续涉及该病员的其它业务。

解决的办法是:存储工厂本身预留了一个回调函数专门用来实现这个功能,只不过经常我们插入数据的时候并不需要返回该数据行的标识,因此视而不见。具体代码如下:

3.3 删除复合主键的数据行

对于删除数据行的情况,存储工厂已经为我们生成了类似 public void DeleteT_patientInfo(System.String patientId)这样的函数,我们可以通过唯一的主键病员ID来删除对应的病员记录。但在一些更为复杂的情况下,如要删除某个病员的一条费用记录,通过病员ID去做删除肯定是不行的,必须使用病员ID与费用条目ID组成的复合主键来进行删除。

解决的过程和办法是:我们首先分析了与存储工厂对应的源码,确定了其接口定义:

public interface IDeleteFactory:IDbToBusinessEntityNameMapper

这个定义说明,数据表的主键不一定必须是整数或者字符串这些简单类型,存储工厂是使用泛型[6]来实现的,这就意味着我们可以使用任何类型来做主键,只要在创建删除工厂的时候指定该类型即可。针对上面的具体案例,定义一个结构体来表达复合主键:

最后在创建删除命令的函数中解析出存储过程需要的复合主键参数:

4 结束语

在医院信息系统的建设和开发过程中,尤其是目前在这种“前有古人,后有来者”的尴尬局面下进行重大的技术创新,必须在保证原有系统正常运行的情况下才可以进行,而且事先需要对新技术本身进行全面深入的研究,并在实践中不断完善。实践是检验真理的唯一标准,要在技术创新与技术风险之间进行合理的平衡,否则就有可能闹出邯郸学步的笑话。但是,一旦技术创新得以成功,就好像在我们面前开启了一扇新的窗户,使我们从巨大的压力下走出来,减少了枯燥繁琐容易出错的编码,节省了大量的时间,为将来应用的融合和扩展铺平了道路,达到事半功倍的效果[7]。

[1] 王革,郭刚,邱松,等.浅谈远程协同区域医疗信息化[J].中国医疗设备,2011,26(10):59-64.

[2] (美)Erich Gamma,等.设计模式:可复用面向对象软件的基础[M]. 李英军,等.译.北京:机械工业出版社,2005.

[3] Hartmut Wilms.Microsoft Patterns & Practices Team publishes RepositoryFactory[EB/OL].2007-8-23)[2011-10-31].http://www.infoq.com/news/2007/08/repository-factory,2007.

[4] 李辉军.微软轻量级“代码生成器”—Repository Factory使用[EB/OL].(2007-11-29)[2011-11-13].http://terrylee.blog.51cto.com/342737/67725/,2007.

[5] Len Fenster.Effective Use of Microsoft Enterprise Library[M] .Seattle:Addison Wesley Professional,2006.

[6] 内格尔,埃夫琴,等.C#高级编程[M].7版.李铭,译.北京:清华大学出版社,2010.

[7] (美)杜瓦尔,等.持续集成:软件质量改进和风险降低之道[M].王海鹏,等,译.北京:机械工业出版社,2008.

Problems and Solutions of Using Repository Factory while Building HIS Entitled for Regional Collaboration Healthcare

YU Dong
Computer Center, Bayannur First Hospital, Bayannur Inner Mongolia 015000, China

With the propelling of the new medical reform policy, regional collaboration healthcare become more important than ever. On the other side, HIS was originally designed as isolated realm. This paper demonstrates how to use Repository Factory to generate a Data Access Layer around HIS as a tie connecting each other, focuses on most specialized scenarios and shares experience with counterparts on how to solve these problems.

repository factory; regional collaboration healthcare; HIS; data access layer

TP319;TP393

A

10.3969/j.issn.1674-1633.2012.05.012

1674-1633(2012)05-0041-03

2011-11-13

2012-03-16

作者邮箱:249791562@qq.com

猜你喜欢
病员信息系统实体
企业信息系统安全防护
手外科腹部皮瓣患者病员服的设计与应用
老年艾滋病患者抗病毒治疗的综合护理对策
前海自贸区:金融服务实体
脑卒中后抑郁的心理护理研究
改良病员服在PICC患者中的应用
实体书店步入复兴期?
基于区块链的通航维护信息系统研究
信息系统审计中计算机审计的应用
两会进行时:紧扣实体经济“钉钉子”