基于领域驱动开发的高校科研成果管理系统的设计与开发
2014-02-07李秉键黄戈文
李秉键,黄戈文
(1.嘉应学院 计算机学院,广东 梅州 514015; 2.嘉应学院 信息网络中心,广东 梅州 514015)
0 引言
高校科研成果管理系统实现高校科研的数字化管理,提高科研管理人员的工作效率,通过数字化手段为科研人员提供科研服务,减少不必要的重复劳动.科研成果管理工作涉及项目、成果、考核、奖励等,工作内容繁多,各种文档的数据格式不一,加大了工作的难度.科研管理人员长期陷于应对每年的项目成果汇总、业绩考核等工作,难以及时有效的掌握最新的科研情况,为领导决策带来影响,甚至给科研工作者也增加了繁琐的负担[1].为此,需要开发一套科研成果管理信息系统.确保科研成果管理工作的规范化、科学化、高效化
管理信息系统的开发实际上是要建立业务系统和计算机模型系统之间的映射管理,从不同的角度建立不同的映射管理,形成不同的开发方法.目前主流的数据存储方式以关系数据库为主,但以数据库建模为核心的软件开发具有以下缺点:[2](1)不能有效的反映需求.(2)导致过程化编程.领域驱动设计(Domain-Driven Design,简称DDD)是Eric Evans在2004年提出的概念,是一种基于模型驱动开发思想的崭新的开发方式[3].DDD开发模式中将模型中的领域对象分为实体、值对象、关联、服务等4类,通过分层体系结构来分离领域,通过工厂、聚合、仓库来封装领域对象并管理领域对象的控制访问方式.DDD开发模式如图1所示.
图1 DDD开发模式示意图[3]
领域驱动设计开发方法改变了传统的以数据库为核心的开发方式,充分利用面向对象的封装、继承和多态的特性进行领域分析与建模,领域模型和技术细节分离,开发人员能够专注于业务逻辑的实现,保证对需求变更的敏捷性和系统的可扩展性.张忠捷[4]等以MIS权限系统为研究对象,按照领域驱动设计的理论,抽象出业务领域模型,构成MIS系统里的类、属性、方法、函数等各种元素的需求领域.
1 高校科研成果管理系统领域建模
1.1 系统分层体系结构
系统分层体系结构(如图2)使领域模型与系统其它技术部分分离系统分为表现层、领域层、基础结构层,领域模型处于领域层,是整个系统的核心部分[5].(1)表现层负责处理对业务服务的请求,构造响应并传递给客户端,包含客户端用户界面逻辑和会话管理部分,表现层还包含了JSON、Web Services等接口[5].本系统的开发中主要应用了ASP.Net MVC技术,通过Model-View-Controller的设计模式构建用户响应页面.(2)应用层定义了系统要完成的工作,调用领域层和基础架构层来进行业务流程的实现,维护应用程序的状态,对工作任务进行协调,本层中使用了WCF组件技术实现应用层服务,定义了DTO(Data Transfer Object)对象和元数据[5].(3)领域层定义了领域模型(Domain Model),负责系统业务逻辑的实现,是系统的核心,包含了业务所涉及的领域对象(实体、值对象)、领域服务.领域层还定义了持久层的接口.(4)基础结构层为为其它各层提供应用消息发送、领域持久化、缓存服务、异常处理、安全机制、日志等技术框架支持.该层还负责与关系数据库、文件系统通信.
图2系统分层体系结构
1.2 领域模型设计
科研成果管理系统需要管理的科研信息类别有科研项目、学术论文、著作、鉴定成果、获奖成果、专利及成果转化等[6].科研成果管理系统按科研要素进行查询、统计, 提供大量的统计报表和数据实现.以此为依据,制定科学的科研工作考核制度,使教师在宽松而又有竞争性的环境中工作[7].
通过对科研成果管理系统的需求分析,得出系统的领域模型.
1.2.1聚合边界的设置
模型包括:成果类别、成果级别、成果、部门、研究团队、学术带头人级别、学术带头人、教师、作品、专利、软件著作权、项目.领域模型还包含这些类之间的关系,如组合、聚合、继承、实现、约束等.高校科研成果管理系统的领域模型如图3所示.
图3 系统领域模型
因为存在教师类和成果类的多对多关联,在实际实现上增加教师成果类,使一个多对多关联转换成一个一对多和一个多对一的关联.
聚合(Aggregate)在领域驱动设计中指的是一组实体或值对象联合起来表述一个完整的领域概念.每个聚合都有一个根实体(聚合根,Aggregate Root).这个根实体是聚合所表述的领域概念的主体,外部对象需要访问聚合内的实体时,只能通过聚合根进行访问,而不能直接访问.领域模型中包含两个聚合,一个是以教师实体为聚合根,一个以教师成果为聚合根.
创建或持久化实体时,需要创建或持久化以其为根的整个聚合.实体类接口定义如下:
public interface IEntity{
Guid ID { get; } /// 获取当前领域实体类的全局唯一标识.}
通过继承实体类接口来定义聚合根接口:
public interface IAggregateRoot : IEntity { }
通过继承聚合根接口来定义教师类:
public class Teache : IAggregateRoot{
public virtual Guid ID //成果ID{
get;
private set;}
public virtual string Name //教师名称{
get;
set;}
public virtual Department Department //通过属性与部门类建立关联{
get;
set;}
public virtual ResearchTeam ResearchTeam //通过属性与开发团队类建立关联{
get;
set;}
……
通过继承聚合根接口来定义教师成果类:
public class TeacherAchievement : IAggregateRoot{
public virtual Guid ID //成果ID {
get;
private set;}
public virtual string Title //成果名称{
get;
set;}
public virtual Achievement Achievement //通过属性与成果类建立关联{
get;
set; }
……
1.2.2值对象与实体的区分
聚合根有独立的生命周期,具有全局的唯一标识;实体的生命周期从属于其所属的聚合,实体完全由其所属的聚合根负责管理维护;值对象是只读的,没有唯一标识,无生命周期言AchievementCategory、AchievementLevel、Department、ResearchTeam和LeaderCategory属于值对象;TeacherAchievement、 Achievement、 ResearchLeader、Teacher、Works、Patent、SoftwareCopyright、Project属于实体.
1.2.3 领域对象的生命周期管理
管理模型对象生命周期为工厂和仓储这两种角色,工厂和仓储的操作都是基于聚合根.对象通过.NET实体框架(EntityFramework)工厂类来创建,.NET实体框架为每一个实体添加了一个工厂方法,该方法包含了一系列原始数据类型和值类型的参数.对象创建后处于活动状态,参与领域层的业务处理,内存中的对象通过析构而消亡.
仓储是领域层与基础结构层的一个衔接组件,领域层通过仓储访问外部存储机制.对象通过仓储实现持久化和重建,根据需要把正在参与处理过程的对象保存到仓储中,或从仓储中读取需要的实体对象,完成读取、保存、查询、删除的操作.
仓储接口的定义如下:
public interface IRepository
where TAggregateRoot : class, IAggregateRoot
{
IRepositoryContext Context { get; }
void Add(TAggregateRoot aggregateRoot);
TAggregateRoot GetByKey(Guid key);
IEnumerable
IEnumerable
TAggregateRoot Get(ISpecification
TAggregateRoot Get(ISpecification
Expression
IEnumerable
IEnumerable
bool Exists(ISpecification
void Remove(TAggregateRoot aggregateRoot);
void Update(TAggregateRoot aggregateRoot);
}
具有仓储接口Irepository,为聚合根TeacherAchievement类和Teacher类创建相应的仓储接口,以TeacherAchievement类为例.
public interface ITeacherAchievementRepository : IRepository
{
IEnumerable
TeacherAchievement GetAchievementByID(Guid achievementID);
……
}
}
2 高校科研成果管理系统功能设计
本系统采用面向领域的建模技术进行系统建模,采用C#语言开发,遵循.Net Framework标准,采用AOP(Aspect-Oriented Programming)的开发方法.主要由用户权限管理,基础数据管理,科研成果录入修改、成果审核、成果查询统计等功能模块组成,系统结构如图4所示.
图4 系统功能结构图
(1)用户权限管理.实现应用系统、部门和用户管理功能;实现用户自助注册和用户审核功能;针对跨应用认证的需要,实现跨应用系统权限管理;对多个应用系统的角色和权限实现增加、修改和删除操作.各个应用系统的角色是相互独立的.增加了系统的灵活性.(2)基础数据管理.是对系统运行所需的代码数据、静态数据的管理,包括部门管理、团队管理、学科带头人管理、成果类别管理、成果级别管理、学术计分设置等子模块组成.(3)成果录入修改.为教师提供科研论文、专著、项目、专利、软件著作权、横向项目等科研成果的录入和修改功能.(4)成果审核.为科研管理人员提供科研论文、专著、项目、专利、软件著作权、横向项目等科研成果的修改和审核功能.(5)成果查询统计.提供对各个院系、学术团体和科研人员个人的各种类型科研成果的统计,其中包括论文、学术著作、项目、专利、软件著作权,成果鉴定、获奖、转让、应用的统计.主要由年度科研分统计、部门成果查询统计,个人成果查询统计等子模块组成.按科研计分方法实现全校、部门和个人的科研统计和实现相关的查询、统计、分析和报表输出功能,实现申硕学科及重点学科负责人、科研院(所)负责人的自动科研计分和合并统计.
4结语
基于领域驱动开发的网络化高校科研成果管理系统的开发,改变了传统的以数据库为核心的开发方法,将领域模型作为开发的核心,充分发挥面向对象分析设计方法的优势,利用Entity Framework等企业级开发框架,使开发工作量较大程度降低,系统具有更好的扩展性和可维护性.
[1] 吴红刚. 大学科研管理平台建设[J]. 硅谷,2012(5):177-178.
[2] 王鹏,刘渊,冷文浩. 领域驱动设计在SPP系统中的应用[J]. 计算机工程与设计,2008,(13):3362-3364.
[3] EVANS E. 领域驱动设计一软件核心复杂性应对之道[M].陈大峰,张泽鑫,译. 北京:清华大学出版社,2006.
[4] 张忠捷,喻昕,王高才. 基于领域驱动的MIS系统细粒度权限模型研究[J].计算机科学,2013,S1:44-49,76.
[5] 黄强,王薇,倪少权. 基于SOA和DDD的铁水联运信息平台构架设计[J].计算机应用与软件,2013(6):124-126,174.
[6] 徐迪义. 高校科研信息管理系统的设计与实现[D] .苏州:苏州大学,2009.
[7] 林文岳,曾志新. 提高高校科技创新能力新探[J].嘉应学院学报,2007(4):80-83.