首页 热点 业界 科技快讯 数码 电子消费 通信 前沿动态 企业前沿 电商

领域驱动设计在爱太极网站中的运用

2023-04-10 12:07:47 来源 : 文秘帮

摘要为了推广普及观海卫太极拳的传承与学习,建设一个高质量的“爱太极”网站十分必要。本文提出基于领域驱动设计的方法,设计了系统主要的领域模型,解决聚合与数据表一对多和应用AOP问题的实现问题。实践结果表明,基于领域驱动设计的网站开发提高了软件的可读性、可维护性和可复用性。


(相关资料图)

关键词领域驱动设计;设计模式;爱太极网站

1引言

“i-观海卫太极拳实验室”于2016年被教育部社区教育中心授牌,于2018年被评为全国终生学习品牌项目。随着学习者的增多,受场地和教练的限制,全部开展线下教学十分困难,打造一个高质量的线上交流学习网站—“爱太极”十分必要。传统的多层开发架构形式上是面向对象,实质是基于数据驱动的开发方法。定义一组DAL操作数据和对象转换,实现的对象不包含业务知识仅作为数据传递的载体的贫血模式,业务逻辑处理集中在服务对象中,导致服务对象逻辑过载,职责划分不清,需求的改变或扩展会导致大面积的代码修改,软件维护和升级面临困难。为了应对上述问题,本文提出采用领域驱动设计(DomainDrivenDesign)方法。该方法是面向对象设计的进阶,主张软件模型和领域知识相关联,构造的领域对象是具有业务含义的富血模式。领域建模是领域驱动设计实践中面临的严峻挑战,需要经过分析、设计、编码人员的多次迭代,反复设计和重构,不断加深对领域知识理解,才能抽象出既反应领域知识又能绑定代码实现的深层模型[1]。本文遵循领域驱动设计规范,抽象领域概念,应用设计模式,设计了爱太极网站主要的领域模型,解决了软件实现中聚合与数据表一对多和应用AOP的问题。

2领域驱动设计

领域驱动设计是EricEvans提出的围绕领域模型进行软件设计和开发的方法[2],包含一套新的理念、概念和方法,指导系统业务分析、模型构建、代码实现。领域模型是抽象领域知识得到的深层模型。有别于简单名称抽取得到的模型,深层模型对所在领域的业务逻辑进行有组织且有选择的抽象,是对领域知识概念的描述。领域驱动设计要求领域模型和技术实现的绑定,技术实现不能偏离模型意图,模型设计要考虑技术实现的可能[3]。领域驱动设计常用的建模范式是面向对象技术。其中实体、值对象、服务这3种元素映射领域概念和业务职责,表达领域知识;聚合、仓储、工厂这3种元素维护对象完整性和管理对象生命周期,以避免混淆业务与技术概念,保持领域模型的独立性[4-5]。

3领域模型设计

爱太极网站为太极拳学习者提供了解、学习、考评、交流的功能,主要包括:(1)管理结构化知识点,对太极拳知识点即招式的文字讲解和视频演练的管理,对太极拳相关资源的上传与下载。(2)支持协助学习活动,提供讨论、评价、问答功能。学习者可以上传练习视频,机构线上组织线下交流活动。(3)评价学习成果。学习者上传考级视频,进行教练初评和学员互评,提供相关知识测试。(4)系统支持服务,包括内容管理、账号管理、活动日志等辅助功能。

3.1知识点模块

爱太极的知识点是招式。知识点领域模型如图1所示,知识点实体对象KN包含招式标题、排序等基本信息,与文本讲解实体对象TextDescrip和演练视频实体对象DemoVideo关联,DemoVideo与视频资源实体VideoResource一对多关联,多规格资源用以适配多类型终端。上述实体对象组成知识点聚合,聚合根是KN。针对每个演练视频,学习者可以上传相应的练习视频。练习视频实体对象PracticeVideo包含上传移除视频资源方法。学习者要对练习视频进行管理。PracticeVideo自成一个聚合,与聚合根KN关联。领域服务类KNService、PracticeVideoService包含对应聚合对象的构建、修改以及查询方法。

3.2主题活动模块

主题活动模块包括活动创建、编辑、报名、作品等功能。领域模型如图2所示,活动实体对象Activity包含活动的基本信息以及报名规则信息,与参与者实体对象Participant一对多关联。它们以Activity为聚合根组成聚合。作品实体对象Works自成一个聚合类,与Activity关联。活动有预设的一组报名规则,只有符合所有规则才被允许报名。将规则判断嵌套在报名方法中,规则的多变和组合会混淆报名概念,也不便规则判断的扩展维护。可将规则判断从报名中分离,显现为独立的概念,规则判断的实现采用职责链模式,抽象处理类JudgeHandler定义规则判断接口,针对每种规则判断派生具体处理类,系统派生类有重复报名判断类JudgeRepeter、年龄限制判断类JudgeAge、总数限制判断类JudgeLimit等。在Activity的报名方法中,组织创建规则判断链,并向链头的具体判断处理对象提交判断请求,请求的传递过程和处理细节由职责链完成。

3.3账号模块

账号模块包含账号注册、认证、角色管理、身份信息管理等功能。领域模型如图3所示,领域实体包括主账号实体对象MainAccount、身份实体对象Identity、关联账号实体对象RelAccount。它们组成账号聚合,MainAccount是聚合根。账号验证是账号管理的关键部分,系统支持第三方登录,多系统账号采取合并方式。账号验证采用策略模式实现不同系统验证选择,IAuth接口定义验证方法签名,在接口实现类中实现不同系统的验证方法。领域服务类AccountAuthservice的验证方法选择具体的验证对象,调用验证方法为应用层提供账号验证服务。应用服务类AccountService包含注册、登录等方法,通过协调调用领域服务类方法实现。例如登录方法LogIn,调用AccountAuthService的IsValidate方法验证账号,在帐号通过验证的前提下,调用AccountService的FindBy方法,获取并返回主账号对象。

4技术实现

4.1聚合与数据表一对多对应

聚合的构造访问机制是仓储,外部对象只能通过仓储获取聚合的引用。设计约束上,一个仓储只处理一个聚合,一个聚合只与一组固定的数据存储容器对应。对于关系型数据库,仓储、聚合、数据表一一对应,其原因是仓储类所有数据访问方法中,数据表名采用硬编码方式。存在聚合与数据表一对多的需求,例如评论。需要进行评论的场景较多,如课程评论、活动评论、新闻评论、作品评论等。评论实体模型和存储结构相同。聚合的处理可采取两种方式。一种是独立处理方式。针对每种类型开发对应的仓储类、聚合类,数据分别存储在不同数据表中。这将导致代码重复、维护性差、评论类型扩展难。另一种是集中处理方式。开发一个评论仓储和聚合类,所有类型评论数据保存在一个数据表中,频繁的评论操作导致单表的记录量大,数据库服务器访问效率降低。要取得代码维护和数据访问效率间的平衡,需实现聚合与数据表一对多对应。为了保持仓储类方法签名一致性,在仓储类中设置数据表名私有变量commentTableName,将数据访问方法中硬编码的数据表名用commentTableName代替,增加SetCommentTable方法,根据评论类型参数,将commentTableName赋值为对应的数据表名。在评论服务类的数据访问方法中,设置数据访问临界区,依次调用仓储类的SetCommentTable和相应的仓储类数据访问方法,保证仓储静态类的共享变量commentTableName一致性。

4.2应用Aop处理支持服务

切面编程(AOP:Aspect-OrientedProgramming)是将通用支持服务与业务逻辑相分离的编程泛型,通用处理封装为一个可重用模块,名为切面(Aspect)。通过剖解封装的业务对象内部,将切面和业务方法进行连接[6]。积分、日志、评论作为通用支持服务,由领域服务类实现通用业务逻辑,切面类将领域服务类和业务类进行连接。系统选用PostSharp作为实现AOP的框架。根据框架约定,对业务类方法声明自定义切面特性(Attribute),特性名称确定切面类名形式,框架完成业务方法和切面的连接。以保存积分为例,积分切面类PointAttribute继承框架提供的OnMethodBoundaryAspect基类。该基类提供了进入、退出、返回等连接点方法,保存积分在业务方法执行之后触发,覆写PointAttribute的OnSuccess连接点方法。根据传入的积分类型特性参数,创建积分实体对象PointItem,调用积分领域服务类AddPointItem方法,保存用户积分记录,修改用户总计分。积分的AOP处理类如图4示。

5结语

本文基于领域驱动设计方法,设计了爱太极网站的主要领域模型,解决了聚合和数据表一对多的问题,并在系统中应用AOP编程。当前系统运行正常,深层领域模型方便知识的交流和代码的维护,工厂、仓储元素的应用隔离了业务和技术概念,代码逻辑和文件结构更加清晰。爱太极网站开发实践为主题学习网站开发提供了借鉴,在新主题学习网站开发中,可以进行部分模块级别的代码复用,为进一步开发专题学习网站的可复用领域构件和框架提供参考。

参考文献

[1]HippchenB,GiesslerP,SteineggerR,SchneiderM,AbeckS.Designingmicroservice-basedapplicationsbyusingadomaindrivendesignapproach.Int’lJournalonAdvancesinSoftware,2017,10(3-4):432-445

[2]EVANSE.Domain-drivenDesign:TacklingComplexityintheHeartofSoftware.NewJersey:Addison-WesleyProfes-sional,2004

[3]钟陈星,李文君,任贵杰,荣国平.面向领域驱动设计的逆向建模支持方法.软件学报,2022,33(07):2562-2580

[4]王莉,吕世炅,梁冰,白海燕.领域驱动的数字图书馆系统重构研究.数字图书馆论坛,2015(05):34-41

[5]李引,袁峰.基于领域驱动设计的应用系统模型.计算机工程与应用,2013,49(16):1-8

[6]张亮,李正卫,蒋烨.基于AOP实现冲突动态检测的实验室预约系统设计.计算机测量与控制,2020,28(04):185-190

作者:肖刚 单位:宁波开放大学

标签:

相关文章

最近更新
java字节流和字符流 2023-04-06 15:45:17
四双念什么字_四双 2023-04-05 04:06:06
云天子 2023-04-03 08:46:13