栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > 学术 > 人文期刊 > 科技视界

基于领域驱动设计的创业工作室管理系统的设计

基于领域驱动设计的创业工作室管理系统的设计

杨咏

摘 要

当前的学生创业工作室担负了比较多的功能,如果使用常规的三层设计管理系统,会捆绑依赖较多。本文探讨了使用领域驱动设计模式来进行学生创新工作室管理平台的设计,基于实体模型的功能归类,以使业务层的划分更为清晰,从而提高了系统的可复用性。

关键词

领域驱动;创新;管理系统

中图分类号: 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 UserInfoRoles { get; set; }

public virtual ICollection UserInfoTokens{ get; set; }

public virtual ICollection UserInfoLoginLogs { get; set; }

}

6 小结

本文基于领域驱动设计,根据创业工作室管理系统完成了整个系统的架构设计,并根据人员管理和项目管理模块的具体业务逻辑进行领域模型设计。运用领域驱动设计可以解决复杂的业务逻辑问题,领域对象的功能设计对接了实际的业务,让领域对象有了良好的职责划分和功能体现。

对于领域驱动设计模式,更多应用结合在微服务的场景下。对于功能性要求不高,投入不是很大的项目,一开始就上微服务,反而会使得开发效率更慢。由于本项目设计受技术以及团队等因素影响相对较小,主要考虑职责单一性,因此暂时不考虑拆分微服务。以后随着用户数量的增加,以及更多的投入,在产品迭代和重构中再进行相关的功能拆分。

参考文献

[1]实现领域驱动设计[M].北京:电子工业出版社,2014.

[2]微服务架构设计模式[M].北京:机械工业出版社,2019.

[3]梁小鸥.探析思维导图辅助系统在高职计算机网络专业学习中的应用[J].现代计算机,2019.

[4]张金松.领域驱动设计在航务海事系统中的应用研究[D].2010.

[5]赵悦,杜俏俏.基于领域驱动的专利申报系统设计[J].2017.

[6]王敬林.基于微服务架构的铁路企业年金系统的研究和关键技术实现[D].2019.

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/xueshu/269324.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号