李秉鍵,黃戈文
(1.嘉應學院 計算機學院,廣東 梅州 514015; 2.嘉應學院 信息網(wǎng)絡中心,廣東 梅州 514015)
高??蒲谐晒芾硐到y(tǒng)實現(xiàn)高校科研的數(shù)字化管理,提高科研管理人員的工作效率,通過數(shù)字化手段為科研人員提供科研服務,減少不必要的重復勞動.科研成果管理工作涉及項目、成果、考核、獎勵等,工作內(nèi)容繁多,各種文檔的數(shù)據(jù)格式不一,加大了工作的難度.科研管理人員長期陷于應對每年的項目成果匯總、業(yè)績考核等工作,難以及時有效的掌握最新的科研情況,為領導決策帶來影響,甚至給科研工作者也增加了繁瑣的負擔[1].為此,需要開發(fā)一套科研成果管理信息系統(tǒng).確??蒲谐晒芾砉ぷ鞯囊?guī)范化、科學化、高效化
管理信息系統(tǒng)的開發(fā)實際上是要建立業(yè)務系統(tǒng)和計算機模型系統(tǒng)之間的映射管理,從不同的角度建立不同的映射管理,形成不同的開發(fā)方法.目前主流的數(shù)據(jù)存儲方式以關系數(shù)據(jù)庫為主,但以數(shù)據(jù)庫建模為核心的軟件開發(fā)具有以下缺點:[2](1)不能有效的反映需求.(2)導致過程化編程.領域驅動設計(Domain-Driven Design,簡稱DDD)是Eric Evans在2004年提出的概念,是一種基于模型驅動開發(fā)思想的嶄新的開發(fā)方式[3].DDD開發(fā)模式中將模型中的領域對象分為實體、值對象、關聯(lián)、服務等4類,通過分層體系結構來分離領域,通過工廠、聚合、倉庫來封裝領域對象并管理領域對象的控制訪問方式.DDD開發(fā)模式如圖1所示.
圖1 DDD開發(fā)模式示意圖[3]
領域驅動設計開發(fā)方法改變了傳統(tǒng)的以數(shù)據(jù)庫為核心的開發(fā)方式,充分利用面向對象的封裝、繼承和多態(tài)的特性進行領域分析與建模,領域模型和技術細節(jié)分離,開發(fā)人員能夠專注于業(yè)務邏輯的實現(xiàn),保證對需求變更的敏捷性和系統(tǒng)的可擴展性.張忠捷[4]等以MIS權限系統(tǒng)為研究對象,按照領域驅動設計的理論,抽象出業(yè)務領域模型,構成MIS系統(tǒng)里的類、屬性、方法、函數(shù)等各種元素的需求領域.
系統(tǒng)分層體系結構(如圖2)使領域模型與系統(tǒng)其它技術部分分離系統(tǒng)分為表現(xiàn)層、領域層、基礎結構層,領域模型處于領域層,是整個系統(tǒng)的核心部分[5].(1)表現(xiàn)層負責處理對業(yè)務服務的請求,構造響應并傳遞給客戶端,包含客戶端用戶界面邏輯和會話管理部分,表現(xiàn)層還包含了JSON、Web Services等接口[5].本系統(tǒng)的開發(fā)中主要應用了ASP.Net MVC技術,通過Model-View-Controller的設計模式構建用戶響應頁面.(2)應用層定義了系統(tǒng)要完成的工作,調(diào)用領域層和基礎架構層來進行業(yè)務流程的實現(xiàn),維護應用程序的狀態(tài),對工作任務進行協(xié)調(diào),本層中使用了WCF組件技術實現(xiàn)應用層服務,定義了DTO(Data Transfer Object)對象和元數(shù)據(jù)[5].(3)領域層定義了領域模型(Domain Model),負責系統(tǒng)業(yè)務邏輯的實現(xiàn),是系統(tǒng)的核心,包含了業(yè)務所涉及的領域對象(實體、值對象)、領域服務.領域層還定義了持久層的接口.(4)基礎結構層為為其它各層提供應用消息發(fā)送、領域持久化、緩存服務、異常處理、安全機制、日志等技術框架支持.該層還負責與關系數(shù)據(jù)庫、文件系統(tǒng)通信.
圖2系統(tǒng)分層體系結構
科研成果管理系統(tǒng)需要管理的科研信息類別有科研項目、學術論文、著作、鑒定成果、獲獎成果、專利及成果轉化等[6].科研成果管理系統(tǒng)按科研要素進行查詢、統(tǒng)計, 提供大量的統(tǒng)計報表和數(shù)據(jù)實現(xiàn).以此為依據(jù),制定科學的科研工作考核制度,使教師在寬松而又有競爭性的環(huán)境中工作[7].
通過對科研成果管理系統(tǒng)的需求分析,得出系統(tǒng)的領域模型.
1.2.1聚合邊界的設置
模型包括:成果類別、成果級別、成果、部門、研究團隊、學術帶頭人級別、學術帶頭人、教師、作品、專利、軟件著作權、項目.領域模型還包含這些類之間的關系,如組合、聚合、繼承、實現(xiàn)、約束等.高校科研成果管理系統(tǒng)的領域模型如圖3所示.
圖3 系統(tǒng)領域模型
因為存在教師類和成果類的多對多關聯(lián),在實際實現(xiàn)上增加教師成果類,使一個多對多關聯(lián)轉換成一個一對多和一個多對一的關聯(lián).
聚合(Aggregate)在領域驅動設計中指的是一組實體或值對象聯(lián)合起來表述一個完整的領域概念.每個聚合都有一個根實體(聚合根,Aggregate Root).這個根實體是聚合所表述的領域概念的主體,外部對象需要訪問聚合內(nèi)的實體時,只能通過聚合根進行訪問,而不能直接訪問.領域模型中包含兩個聚合,一個是以教師實體為聚合根,一個以教師成果為聚合根.
創(chuàng)建或持久化實體時,需要創(chuàng)建或持久化以其為根的整個聚合.實體類接口定義如下:
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 //通過屬性與部門類建立關聯(lián){
get;
set;}
public virtual ResearchTeam ResearchTeam //通過屬性與開發(fā)團隊類建立關聯(lián){
get;
set;}
……
通過繼承聚合根接口來定義教師成果類:
public class TeacherAchievement : IAggregateRoot{
public virtual Guid ID //成果ID {
get;
private set;}
public virtual string Title //成果名稱{
get;
set;}
public virtual Achievement Achievement //通過屬性與成果類建立關聯(lián){
get;
set; }
……
1.2.2值對象與實體的區(qū)分
聚合根有獨立的生命周期,具有全局的唯一標識;實體的生命周期從屬于其所屬的聚合,實體完全由其所屬的聚合根負責管理維護;值對象是只讀的,沒有唯一標識,無生命周期言AchievementCategory、AchievementLevel、Department、ResearchTeam和LeaderCategory屬于值對象;TeacherAchievement、 Achievement、 ResearchLeader、Teacher、Works、Patent、SoftwareCopyright、Project屬于實體.
1.2.3 領域對象的生命周期管理
管理模型對象生命周期為工廠和倉儲這兩種角色,工廠和倉儲的操作都是基于聚合根.對象通過.NET實體框架(EntityFramework)工廠類來創(chuàng)建,.NET實體框架為每一個實體添加了一個工廠方法,該方法包含了一系列原始數(shù)據(jù)類型和值類型的參數(shù).對象創(chuàng)建后處于活動狀態(tài),參與領域層的業(yè)務處理,內(nèi)存中的對象通過析構而消亡.
倉儲是領域層與基礎結構層的一個銜接組件,領域層通過倉儲訪問外部存儲機制.對象通過倉儲實現(xiàn)持久化和重建,根據(jù)需要把正在參與處理過程的對象保存到倉儲中,或從倉儲中讀取需要的實體對象,完成讀取、保存、查詢、刪除的操作.
倉儲接口的定義如下:
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類創(chuàng)建相應的倉儲接口,以TeacherAchievement類為例.
public interface ITeacherAchievementRepository : IRepository
{
IEnumerable
TeacherAchievement GetAchievementByID(Guid achievementID);
……
}
}
本系統(tǒng)采用面向領域的建模技術進行系統(tǒng)建模,采用C#語言開發(fā),遵循.Net Framework標準,采用AOP(Aspect-Oriented Programming)的開發(fā)方法.主要由用戶權限管理,基礎數(shù)據(jù)管理,科研成果錄入修改、成果審核、成果查詢統(tǒng)計等功能模塊組成,系統(tǒng)結構如圖4所示.
圖4 系統(tǒng)功能結構圖
(1)用戶權限管理.實現(xiàn)應用系統(tǒng)、部門和用戶管理功能;實現(xiàn)用戶自助注冊和用戶審核功能;針對跨應用認證的需要,實現(xiàn)跨應用系統(tǒng)權限管理;對多個應用系統(tǒng)的角色和權限實現(xiàn)增加、修改和刪除操作.各個應用系統(tǒng)的角色是相互獨立的.增加了系統(tǒng)的靈活性.(2)基礎數(shù)據(jù)管理.是對系統(tǒng)運行所需的代碼數(shù)據(jù)、靜態(tài)數(shù)據(jù)的管理,包括部門管理、團隊管理、學科帶頭人管理、成果類別管理、成果級別管理、學術計分設置等子模塊組成.(3)成果錄入修改.為教師提供科研論文、專著、項目、專利、軟件著作權、橫向項目等科研成果的錄入和修改功能.(4)成果審核.為科研管理人員提供科研論文、專著、項目、專利、軟件著作權、橫向項目等科研成果的修改和審核功能.(5)成果查詢統(tǒng)計.提供對各個院系、學術團體和科研人員個人的各種類型科研成果的統(tǒng)計,其中包括論文、學術著作、項目、專利、軟件著作權,成果鑒定、獲獎、轉讓、應用的統(tǒng)計.主要由年度科研分統(tǒng)計、部門成果查詢統(tǒng)計,個人成果查詢統(tǒng)計等子模塊組成.按科研計分方法實現(xiàn)全校、部門和個人的科研統(tǒng)計和實現(xiàn)相關的查詢、統(tǒng)計、分析和報表輸出功能,實現(xiàn)申碩學科及重點學科負責人、科研院(所)負責人的自動科研計分和合并統(tǒng)計.
基于領域驅動開發(fā)的網(wǎng)絡化高??蒲谐晒芾硐到y(tǒng)的開發(fā),改變了傳統(tǒng)的以數(shù)據(jù)庫為核心的開發(fā)方法,將領域模型作為開發(fā)的核心,充分發(fā)揮面向對象分析設計方法的優(yōu)勢,利用Entity Framework等企業(yè)級開發(fā)框架,使開發(fā)工作量較大程度降低,系統(tǒng)具有更好的擴展性和可維護性.
[1] 吳紅剛. 大學科研管理平臺建設[J]. 硅谷,2012(5):177-178.
[2] 王鵬,劉淵,冷文浩. 領域驅動設計在SPP系統(tǒng)中的應用[J]. 計算機工程與設計,2008,(13):3362-3364.
[3] EVANS E. 領域驅動設計一軟件核心復雜性應對之道[M].陳大峰,張澤鑫,譯. 北京:清華大學出版社,2006.
[4] 張忠捷,喻昕,王高才. 基于領域驅動的MIS系統(tǒng)細粒度權限模型研究[J].計算機科學,2013,S1:44-49,76.
[5] 黃強,王薇,倪少權. 基于SOA和DDD的鐵水聯(lián)運信息平臺構架設計[J].計算機應用與軟件,2013(6):124-126,174.
[6] 徐迪義. 高??蒲行畔⒐芾硐到y(tǒng)的設計與實現(xiàn)[D] .蘇州:蘇州大學,2009.
[7] 林文岳,曾志新. 提高高??萍紕?chuàng)新能力新探[J].嘉應學院學報,2007(4):80-83.