楊詠


摘 要
當前的學生創業工作室擔負了比較多的功能,如果使用常規的三層設計管理系統,會捆綁依賴較多。本文探討了使用領域驅動設計模式來進行學生創新工作室管理平臺的設計,基于實體模型的功能歸類,以使業務層的劃分更為清晰,從而提高了系統的可復用性。
關鍵詞
領域驅動;創新;管理系統
中圖分類號: TP311.52 ? ? ? ? ? ? ? ? ?文獻標識碼: A
DOI:10.19694/j.cnki.issn2095-2457 . 2020 . 14 . 42
0 前言
近年來,隨著軟件行業的飛速發展,現在的軟件更多的更重視后期的運維和產品根據需求再進行迭代。從軟件(software)的英文單詞上來說,我們也可以理解,軟件必須保持soft,也就是必須保持靈活。軟件需要更容易被修改。因此,當我們開發一套產品,如果按照傳統的數據庫設計模式,把業務放在邏輯層中,會容易造成業務上的重疊和混亂。你中有我,我中有你,模塊間的耦合性太強,從而導致開發的人員比較難去對軟件進行更新迭代。
DDD模式全稱是:Domain-Driven—Design。DDD模式是由Eric Evans 在2004年提出的,他發表了《領域驅動設計——軟件核心復雜性應對之道》(Domain-Driven Design –Tackling Complexity in the Heart of Software),簡稱Evans DDD。[1]
領域驅動模式是一種用面向對象的思想對軟件進行設計和建模,它拋棄了傳統的工程師對于數據庫的建模方式,在業務設計上,以實體領域來對業務的功能進行封裝和設計。基于該模式設計的軟件產品,使得業務界限和功能分析相對很清楚,很好地實現了模塊之間的解耦。可以說,這些年來微服務的流行,其中很大部分也是得益于領域驅動模式的設計理念。
1 項目背景
目前,在項目化進程的教學體系下,我們高等職業院校的工科類學生幾乎都擁有相關的校內實訓基地,或稱為學生創新創業工作室。在日常的管理中,除了一些常規的管理活動外,工作室還承擔了訂制一些需求的項目。學生通過加入這些項目,一方面鍛煉了自己的開發項目的能力,可以使自己的知識體系和能力做了一個深度融合,使得工作室能發揮最大的能動性。通過構建創新創業工作室管理平臺,我們可以提供一個平臺給用戶去自行訂制自己所需要的項目,同時學生也可以根據自己的能力加入相對應的項目開發,達到知識能力和素質能力的融合。
之前,我們普遍的項目都是采用了貧血模式的三層MVC架構的開發。在簡單的業務需求上,三層架構也比較好的滿足了客戶的需求。可是,我們發現,三層架構的項目后續更新,可擴容性不強。比如說,在三層當中的邏輯BLL層,因為業務的調整,我們添加了很多新的方法,但是這些方法與實體的關系不大。因此在邏輯分層中,不夠清晰,也因為開發的學生流動性比較大,維護的團隊上手業務需要比較長的時間。創業工作室管理平臺業務過程比較復雜,為了能讓開發過程更規范,讓系統具有良好的維護性和滿足SOLID的設計原則,我們基于領域驅動設計思想設計了本系統,更關注業務的面向對象的思想來進行重新封裝。在本系統中,我們基于領域模型的建立,把系統分析和設計做了良好的融合,使得系統的分層結構更為清楚,提高了系統的擴展性,讓產品能更靈活地根據需求進行改動。
2 系統架構
2.1 系統功能設計
創業工作室管理系統功能主要包括:人員管理、圖書管理、資產管理、項目管理四六大模塊。功能模塊如圖1所示。
2.2 系統建設特點
(1)采用前沿技術。本系統是基于.net平臺的.netCore3.1版本進行開發,結合EFCore、 Docker、IdentityServer4,數據庫采用Mysql、MongoDB,項目部署在CentOS上。在對系統使用領域驅動模型設計后,使系統的業務分割清楚,能夠有更大的自由度,提高系統的可擴展性。
(2)高性能。本系統采取了B/S結構,用戶通過瀏覽器或手機API就可以直接進行系統的訪問。用戶的前端界面設計采用Vue框架來進行數據渲染。本系統為了提高響應性能,進行了前后端分離,采用異步加Json數據加載的格式。數據庫采用Mycat中間件對Mysql進行數據庫讀寫分離和主從復制,提高數據并發查詢能力。
(3)權限清晰。對于不同的角色,用戶可以擁有不同的操作權限。在權限分派上,分為普通用戶、管理員和超級管理員。
(4)低耦合。本系統中采用六邊形體系結構對于不同的場景進行邊界的劃定。在本項目的實際情境中,我們所有的功能基本上都是圍繞用戶的業務和項目的開展維護等來展開的。因此,在領域設計中,我們需要根據領域及語義邊界等因素確定限界上下文,將同一個語義環境下的一個或者多個聚合放在一個限界上下文內。比如說,項目人員管理與用戶管理兩者業務關聯緊密,可以共同完成人員管理功能,兩者一起構成人員管理限界上下文,創新項目發布則可以單獨形成項目發布限界上下文。
(5)信息安全。對于關鍵敏感數據,比如密碼、金額,采用MD5加密算法對數據進行加密,數據庫中存放密文或檢驗碼,防止超級管理員進行密碼泄露。由于在本項目中涉及金額的支付,因此需要采用OAuth2來對用戶進行授權認證。在用戶登錄部分,也結合發送手機驗證碼方式來結合用戶的認證。
3 領域驅動架構設計
3.1 領域驅動設計的優勢
領域驅動設計區別于之前的MVC三層設計模式的地方在于:在這種開發模式下,我們必須先整理清楚系統的業務需求,整理好領域模型所包含的屬性和方法。領域模型相當于可以進行復用的Service層。對于新功能需求的開發,都基于之前定義好的這些領域模型來完成。這樣可以保證系統可以準確地基于業務需求的建模來實現。本文采用領域模型驅動設計的思想,業務邏輯需要進行分割,分析每個模塊所對接的實體設計,把復雜的功能設計轉換為關注實體模型對接的業務功能并封裝到對應的實體功能中。領域模型改為由更多細粒度的類組成。基于領域驅動設計,可以保證系統的可維護性、擴展性和復用性。
領域驅動的核心應用場景就是解決復雜業務的設計問題,其特點與這一核心主題息息相關。對于復雜的系統,它對代碼的復用性、易維護性要求就越高,因此,前期設計就顯得尤為重要。而基于領域設計開發模式,逼迫我們進行大量的業務調研、領域模型設計,從而更好劃分功能的界限。
3.2 領域驅動設計的開發流程
基于領域驅動設計的開發流程顯得尤為重要。
首先,我們需要把相同業務的服務拆分成單獨的業務池,比如,在圖1中的系統項目管理模塊中,我們可以按照業務的維度拆分成項目情況池、項目分類池、評論池和搜索池。其中,每個業務依賴獨自的數據庫資源,不依賴其他業務的數據庫資源。如果當某個業務接口出現兼容或發展問題時,我們只需要對業務池進行擴展即可,這樣就大大減少了擴容的復雜度。
第二,根據業務接口的重要程度,可以把業務分為核心池和非核心池。比如,就項目情況池而言,發布項目、加入項目接口相對重要一些,可以放在核心池里面;項目完成情況查詢的操作就相對不那么重要,可以放在非核心池里面。通過核心接口和非核心接口的分類,我們可以對核心池的性能優先進行保證,從而保證整體系統的穩定性。
第三,我們可以根據接入客戶端類型的不同做業務池的拆分。比如,服務于小程序或者APP頁面的業務可以定義為移動端池,服務于內部其他部門的業務可以定義為內網池,等等。
4 創業工作室管理系統領域驅動架構設計
本系統中對領域模型驅動進行了具體設計,其框架如圖2所示。
基于創業工作室管理系統的業務需求,對每層的設計進行詳細說明如下:
(1)數據訪問層:采用MySql+MongoDB數據庫管理軟件,結合關系型數據庫和非關系型數據庫進行業務擴展。
(2)業務邏輯層:按領域模型人員管理和項目管理等業務進行建模,減少業務之間的耦合成都,保證其獨立性。在實體模型中,按照領域驅動設計的思想, 按實體對象中設計相關的屬性和功能設計。
(3)UI層:本系統前后端分離,后端曝露接口給前端調用。因此,切分APP端用戶、Web端用戶相對容易。在前端部分,采用Vue框架進行頁面數據渲染,異步加載數據,從而提高響應速度。
5 系統部分實體模型設計
在實體Entity部分,主要分為UserInfo類和ProjectInfo類。本文羅列了UserInfo類的設計。
UserInfo類設計如下:
[Table("UserInfo")]
public partial class UserInfo{
/*用戶信息部分,包含消息驗證以及角色校驗*/
public UserInfo(){
UserInfoTokens = new HashSet
UserInfoLoginLogs = new HashSet
UserInfoRoles = new HashSet
}
public Guid Id { get; set; }
public string Account { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string MobilePhone { get; set; }
public string Password { get; set; }
public string Salt { get; set; }
public string Sex { get; set; }
public bool Enabled { get; set; }
public bool IsAdmin { get; set; }
public DateTime CreationTime { get; set; }
public int LoginFailedNum { get; set; }
public DateTime? AllowLoginTime { get; set; }
public bool LoginLock { get; set; }
public DateTime? LastLoginTime { get; set; }
public string LastIpAddress { get; set; }
public DateTime? LastActivityTime { get; set; }
public bool IsDeleted { get; set; }
public DateTime? DeletedTime { get; set; }
public DateTime? ModifiedTime { get; set; }
public Guid? Modifier { get; set; }
public Guid? Creator { get; set; }
public virtual ICollection
public virtual ICollection
public virtual ICollection
}
6 小結
本文基于領域驅動設計,根據創業工作室管理系統完成了整個系統的架構設計,并根據人員管理和項目管理模塊的具體業務邏輯進行領域模型設計。運用領域驅動設計可以解決復雜的業務邏輯問題,領域對象的功能設計對接了實際的業務,讓領域對象有了良好的職責劃分和功能體現。
對于領域驅動設計模式,更多應用結合在微服務的場景下。對于功能性要求不高,投入不是很大的項目,一開始就上微服務,反而會使得開發效率更慢。由于本項目設計受技術以及團隊等因素影響相對較小,主要考慮職責單一性,因此暫時不考慮拆分微服務。以后隨著用戶數量的增加,以及更多的投入,在產品迭代和重構中再進行相關的功能拆分。
參考文獻
[1]實現領域驅動設計[M].北京:電子工業出版社,2014.
[2]微服務架構設計模式[M].北京:機械工業出版社,2019.
[3]梁小鷗.探析思維導圖輔助系統在高職計算機網絡專業學習中的應用[J].現代計算機,2019.
[4]張金松.領域驅動設計在航務海事系統中的應用研究[D].2010.
[5]趙悅,杜俏俏.基于領域驅動的專利申報系統設計[J].2017.
[6]王敬林.基于微服務架構的鐵路企業年金系統的研究和關鍵技術實現[D].2019.