二代水务系统架构设计分享——DDD+个性化

这篇具有很好参考价值的文章主要介绍了二代水务系统架构设计分享——DDD+个性化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系统要求

C/S架构的单体桌面应用,可以满足客户个性化需求,易于升级和维护。相比于一代Winform,界面要求美观,控件丰富可定制。

二代水务系统架构设计分享——DDD+个性化

解决方案

依托.Net6开发平台,采用模块化思想设计(即分而治之的策略),每个模块采用DDD分层设计。前端选用WPF + Prism框架,后端选用ABP + EF框架,数据库选择SQL Server。

业务拆分     

核心领域:包含用户管理、客户管理、表具管理、方案管理、抄表管理

通用领域:包含权限、菜单、个人中心、参数配置、审计日志、数据字典

支撑领域:包含数据查询、统计报表、消息管理、STS安全、工单、自动升级

业务建模

通过业务拆分,水务领域已经被划分为若干子领域(即模块)。每个模块可以看成是一个限界上下文,在此边界内可以进一步拆分更细粒度的单元(我们把最小的业务单元叫做聚合)。一个模块也可能只有一个聚合,如:数据字典。

先拿简单的用户管理来说,用户(User)、角色(Role)、组织(Organization)三者关系紧密、彼此协作。一个用户可以拥有多个角色,一个组织可以拥有多个用户,因此可以归属到用户限界上下文,它们既是实体又是聚合根。

再拿复杂一点的客户管理来说,客户可分为预付费和后付费两种。对于预付费客户来说,可以按量或按金额购水。对于后付费客户来说,每月会生成一笔月账单,客户需要及时充值,否则就会欠费。因此,在客户这个业务边界内,可以建立客户(Customer)、客户类型(CustomerType)、交易记录(Transactions)、月账单(MonthlyBilling)等领域对象。其中水费的计算是一个非常复杂的业务逻辑,涉及到阶梯价格、附加费、债务、当月历史售水交易等多个领域实体,所以需要借助领域服务来完成这笔交易。

系统设计

系统设计包含两部分:全局设计局部设计

全局设计是从框架角度来进行整体设计。系统框图如下:

二代水务系统架构设计分享——DDD+个性化

虚线框部分为笔者设计的Lapis.Framework框架,文件组织结构如下:

二代水务系统架构设计分享——DDD+个性化

其中,Laison.Lapis.XXX文件夹代表基础业务模块(Laison.Lapis.Shared除外),如:审计日志、消息管理等,每个模块就是一个独立的C#解决方案。Laison.Lapis是一个底层类库,封装各种通用基础功能,供上层调用。Laison.Lapis.Shared称之为共享模块,用于封装和业务无关,可以被业务模块共享使用的功能,如: 抽象基类、接口、虚方法等。因为是单体应用设计,所以模块之间少不了相互引用的关系。模块划分越多,引用关系也会变得越复杂。

局部设计是从业务角度来进行模块设计,每个模块按照DDD来分层:基础设施层、领域层、应用层和表现层。下面是用户管理模块(Laison.Lapis.Identity)的分层设计:

二代水务系统架构设计分享——DDD+个性化

     Laison.Lapis.Identity.UI:表现层,包含前端页面、控件和一些UI逻辑。
     Laison.Lapis.Identity.Application.Contracts:应用接口层,负责定义应用接口和DTO。
     Laison.Lapis.Identity.Application:应用层,用于实现应用接口,包含各种应用逻辑。
     Laison.Lapis.Identity.Domain:领域层,负责业务逻辑处理,包含实体、值对象、仓储接口等领域模型。
     Laison.Lapis.Identity.Domain.Shared:领域共享层,包含了一些枚举和常量的定义,可供其它任意层调用。
     Laison.Lapis.Identity.EntityFramework:实体框架层(EF),包含实体的映射配置和仓储的实现。
     Laison.Lapis.Identity.HttpApi.Host 和 Laison.Lapis.Identity.Shell:即宿主和壳,分别用来启动前/后端应用程序。

在ABP框架的世界里,每一分层就是一个模块单元,它是代码层面的模块,而Identity是业务层面的模块,后者包含前者,最终以DLL的形式来呈现。

系统如何运行

每个模块负责自己的业务功能,各司其职,又彼此依赖。模块划分越细,内聚性越强,代码的复用性就越高。 当系统要完整运行所有功能时,只需要像搭积木一样,把各个模块进行组装就行,做到即插即用。为了方便代码复用和管理,笔者采用Nuget包的形式将业务模块引入到项目中使用,这在开发初期似乎没有什么问题。

但随着系统不断迭代,模块数量也再随之增长。假设1个模块会生成6个DLL(采用DDD分层),那么20个模块就会有120个DLL,听上去有点吓人。每次模块发生变化,就要重新打包、发布、升级120个Nuget包,这显然不符合常理(非常耗时)。后来笔者采取了一种折中的处理方式:将通用稳定性强的模块保留在Lapis.Framework中,把易于变化的模块下沉到项目中管理,这样就能避免之前的尴尬,但却牺牲了模块代码的复用性。项目最终代码结构如下:

二代水务系统架构设计分享——DDD+个性化

个性化定制

企业个性化功能定制是一个普遍而又绕不开的话题,假如能用一套代码把所有客户的需求全部覆盖,当然是最理想的状态(现实几乎不可能,除非通用标准化)。所以笔者从设计一开始就是围绕如何提高代码的复用,将差异化分散到项目中的思路来展开,这也是采用模块化设计的初衷。至于个性化如何来实施?根据笔者已知的做法有以下两种:1. 通过版本管理开分支的方式,2. 简单粗暴,每个项目都单独复制一套标准版,然后在上面做定制化修改。 除此之外,笔者似乎没有想到更好的办法。至于选择哪一种,就要根据项目实际情况来考量。

结束语

无论是模块化设计还是DDD,都是强调从业务领域角度出发,根据业务的发展,合理划分业务边界,采用分治策略,降低业务和软件开发的复杂度,持续调整现有架构,以保持架构和代码的生命力。 因此,世界上并不存在一劳永逸的架构,软件设计本身就是一个平衡取舍的过程,只有合适的才是最好的,这也许就是架构设计的魅力所在吧!如果你有好的建议或不同想法,欢迎评论区留言。文章来源地址https://www.toymoban.com/news/detail-631997.html

到了这里,关于二代水务系统架构设计分享——DDD+个性化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于springboot图书个性化推荐系统的设计与实现【附ppt和万字文档(Lun文)和搭建文档】

    前台登录: ①首页:图书名称查询、图书信息推荐、好书推荐、图书信息展示 ②图书信息:图书类别、图书名称、名称类别作者查询、图书详情、收藏、点赞、评论 ③好书推荐:图书展示、点击查看 ④留言反馈:用户可以进行留言反馈 ⑤个人中心:可以查看自己的信息、

    2024年02月13日
    浏览(39)
  • 领域驱动设计DDD架构解析和绘图模板分享

    DDD整洁架构 DDD整洁架构为了解决强调用的关系,出现了 洋葱架构(六边形)架构 ,就是为了实现 依赖倒置 它的思想就是把领域模型放到核心的位置, 领域模型 是独立的,不会直接强依赖其他层,而通过 适配器 来完成领域模型和外层的数据交换。 DDD分层架构和三层架构的

    2024年02月05日
    浏览(39)
  • 机器之心 AI 技术--人工智能助力个性化视频实战经验分享(文末送书)

    在视频生成即将迎来技术和应用大爆发之际,为了帮助企业和广大从业者掌握技术前沿,把握时代机遇,机器之心AI论坛就将国内的视频生成技术力量齐聚一堂,共同分享国内顶尖力量的技术突破和应用实践。 论坛将于2024.01.20在北京举办,现场汇聚领域内专家和一线开发者,

    2024年02月03日
    浏览(43)
  • midjourney教程:如何快速生成个性化Logo设计

    midjourney是一款基于人工智能技术的Logo设计工具,它可以帮助用户快速生成个性化的Logo设计,而无需具备专业的设计技能。下面将为大家介绍midjourney的使用方法,以帮助大家轻松生成符合自己需求的Logo设计。 第一步:登录midjourney网站并选择Logo设计 首先,进入midjourney官网并

    2024年02月11日
    浏览(39)
  • 大学生个性化旅游网站的设计与实现

    如今的互联网技术也很成熟,原来生活中的很多线下服务也在逐渐的转型,传统线下旅游服务已经逐渐转变为线上旅游服务,现代新型线上旅游服务和之前的线下传统服务的不同之处在于线上服务是双向交流的,在互动中为用户提供个性化服务。在大数据和互联网以及旅游行

    2024年01月17日
    浏览(40)
  • 用户界面设计和交互设计中的用户体验个性化(AI)

    作者:禅与计算机程序设计艺术 随着互联网、移动互联网、物联网等新型信息技术的广泛应用,传统的静态网站在面对动态变化的需求时显得力不从心。因此,动态网站应运而生。动态网站能够更好地满足用户的需要,用户可以快速找到自己想要的信息、做出决策或进行交易

    2024年02月09日
    浏览(38)
  • 个性化信息推荐系统体系结构

    目前,个性化信息推荐系统总的来说可以分 为基于规则的和基于过滤的两种推荐系统。基于关联规则的个性化信息服务,主要 针对特定的站点组织结构,采用最大向前访问路径辅助内容事务方法。制定一系列 规则并利用这些规则为特定用户提供服务。利用规则来推荐信息依

    2024年02月12日
    浏览(41)
  • 一、 个性化电商广告推荐系统介绍

    1.1 数据集介绍 Ali_Display_Ad_Click是阿里巴巴提供的一个淘宝展示广告点击率预估数据集 数据集来源:天池竞赛 原始样本骨架raw_sample 淘宝网站中随机抽样了114万用户8天内的广告展示/点击日志(2600万条记录),构成原始的样本骨架。 字段说明如下: user_id:脱敏过的用户ID;

    2024年02月13日
    浏览(46)
  • 个性化纹身设计,Midjourney带你探索独一无二的艺术之美

    hello,大家好,欢迎回来。 在当今社会,纹身已经变得非常常见。 在寻求与众不同的个性化纹身时,你是否曾经为了找不到独特的设计而苦恼? 现在,Midjourney将为你打开一扇全新的艺术之门,引领你探索纹身设计的无穷魅力。 我们深知每一个纹身都承载着个人的故事和情感

    2024年02月22日
    浏览(38)
  • CSDN个性化推荐系统-负反馈测试

    CSDN个性化推荐系统-负反馈测试 大家好,我是空空star,本篇给大家分享一下 《CSDN个性化推荐系统-负反馈测试》 。 用户:weixin_38093452 1.1个人中心界面 1.2从标签中可以发现什么? 标签有一级标签、二级标签 标签并不都是全小写,也有一些字母大写 同一个标签在感兴趣和不

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包