领域驱动设计-从贫血模型到充血模型

背景

领域模型对象只是用来存储应用的数据。业务逻辑位于服务层中,管理域对象的数据。在服务层中,应用的每个实体对应一个服务类。这种模式大家是不是很熟悉,尤其是在中小项目或者项目刚启动的时候,都是怎么方便怎么来;没错,这就是贫血模型。

一般画风是这样的。

1、Web层:接收用户输入,将数据传至服务层;

2、服务层:处理业务逻辑、权限管理与授权,并与存储层通信;

using BQoolCommon.Interface.Repository.Dapper;
using BQoolCommon.Interface.Service;
using BQoolCommon.Models.BQoolCommon_SetMain;
using BQoolCommon.Models.Enum;
using BQoolCommon.Models.ViewModel;
using System;
using System.Collections.Generic;
using System.Configuration;namespace BQoolCommon.Service
{public class UserPermissionService : IUserPermissionService{private readonly IInnerSiteMapDapperRep _innerSiteMapDapperRep;private readonly IInnerSiteMapService _innerSiteMapService;private readonly IAccountChannelRelService _accountChannelRelService;private readonly IUserMgmtService _userMgmtService;public UserPermissionService(IInnerSiteMapDapperRep innerSiteMapDapperRep,IInnerSiteMapService innerSiteMapService, IAccountChannelRelService accountChannelRelService, IUserMgmtService userMgmtService){_innerSiteMapDapperRep = innerSiteMapDapperRep;_innerSiteMapService = innerSiteMapService;_accountChannelRelService = accountChannelRelService;_userMgmtService = userMgmtService;}
.................................................

3、存储层:与数据库进行通信,对数据进行持久化;

using System.Linq;
using BQoolCommon.Interface.Factory;
using BQoolCommon.Interface.Repository.Entity;
using BQoolCommon.Models.BQoolCommon_SetMain;
using BQoolCommon.Models.ViewModel;namespace BQoolCommon.Repository.Entity
{public class WeChatSubscribeEntityRep : GenericEntityRep<WeChat_Subscribe>, IWeChatSubscribeEntityRep{public WeChatSubscribeEntityRep(IBqoolSetMainDbContextFactory factory) : base(factory){}}
}

问题窥探

问题出在了服务层,他承受了太多的职责,像业务逻辑、权限检查等等,这违反了单一职责原则,并产生了大量的依赖。当业务复杂度上升时,服务层所包含的代码将会非常庞大和复杂。服务层需要包含应用逻辑、用户会话的管理;领域层应该包含业务逻辑,可以处理与业务相关的会话状态。

改进思路

我们需要将业务逻辑从服务层移动到领域模型中,这样的好处是,服务层可以只负责应用逻辑(如数据有效性验证、授权检查、开始结束事务等),领域模型可以专门负责其相关的业务逻辑。以电商系统来举例,架构设计时完全可以针对订单、商品、库存等多个领域模型进行建模,相关的业务可以分别放到不同的领域模型中,一些很有可能重复的业务代码都会被集中到一处,从而降低了复制-粘贴的可能性,这就是充血模型。

影响

充血模型将服务类变得更小,使之只负责单一的职责。例如商品的CRUD和其他操作,就可以将其放到两个不同的服务类中,一个负责商品的CRUD操作,另外一个负责与商品相关的其他操作。这样就能使服务类变得小巧、松散、可测试了,同时还能降低其他人理解与重用的成本。

总结

1、从规范和长远来看肯定是充血模型合适些。

2、但是如果只是小项目、求快的话,当然是开发成本低的贫血模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python离群点检测_如何从熊猫DataFrame中检测峰点(离群值)

我有一个带有多个速度值的熊猫数据帧&#xff0c;这些速度值是连续移动的值&#xff0c;但它是一个传感器数据&#xff0c;因此我们经常在中间出现误差的情况下&#xff0c;移动平均值似乎也无济于事&#xff0c;所以我可以采用什么方法用于从数据中删除这些离群值或峰点&#…

普通故障处理流程

一般OA或者BOSS的用户报故障后流程如下。、从中心机房扫描微波如果基站端能扫描到&#xff0c;但是客户端无法扫描。基本可以排除 基站端设备正常&#xff08;除天线外&#xff09;。问题一般出在客户那里&#xff0c;比如客户端微波数据丢失&#xff0c;停电。天线问题&#x…

普通用户nginx访问不了_Nginx降权启动之使用普通用户管理 | it运维_it技术_linux运维-追梦人博客...

一、介绍1.1、什么是nginx降权启动降权启动&#xff1a;即nginx的启动与管理使用非root用户来启动与管理&#xff0c;这样就防止每次修改配置重启时都需要用root用户来重启了。注意&#xff1a;普通用户只能只用1024以上的端口&#xff0c;不可以直接使用80或者443端口(前面可以…

读书 | IT人如何直击本质洞察底层逻辑?

【好书共读】| 作者/Edison Zhou作为IT技术人&#xff0c;我们不仅要精进技术&#xff0c;也要在技术之外修炼自己的软能力。本质思考&#xff0c;是一种直击事物本质的能力&#xff0c;是思考“思考的方法”&#xff0c;是一切思考的原动力。我们不用担心这个能力在其他企业用…

编译AjaxControlToolkit发生错误如何解决?

错误的具体内容是&#xff1a;Error 1 Could not load file or assembly vjslib, Version2.0.0.0, Cultureneutral, PublicKeyTokenb03f5f7f11d50a3a or one of its dependencies. TemplateVSI\TemplateVSI.csproj 未能加载文件或程序集“vjslib, Version2.0.0.0, Cultureneut…

内网通mac能用吗_纯干货!小容量Mac装外置硬盘Windows系统最完美的方案!(多图)...

很多用Mac 的同学都会碰到一个很头疼的问题&#xff0c;那就是对 Windows系统的需求&#xff0c;macOS系统虽好&#xff0c;但是很多专业性软件都没有Mac 版本(特别是对国内的用户)&#xff0c;这时大家就会对 Windows系统有需求了。这时候很多同学会想到使用虚拟机或者装 Boot…

卖shell看站什么意思_粤语俚语卖咸鸭蛋是什么意思?

点读&#xff1a;卖咸鸭蛋&#xff08;maai6 haam4 aap3 daan6&#xff09;点解&#xff1a;就是死了的意思点造句&#xff1a;粤&#xff1a;您搵丧彪啊&#xff0c;佢琴日去劈友唔小心赖咗嘢&#xff0c;宜家已经去咗卖咸鸭蛋啦~~普&#xff1a;你找丧彪吗&#xff0c;他昨天…

asp.net core安全事项(上)

隐藏web服务端信息创建一个asp.net core mcv web项目&#xff0c;运行&#xff0c;F12查看返回信息&#xff0c;如下图&#xff0c;会清晰看到服务端的类型是kestrel.有时安全检测要求不能显示服务端信息&#xff0c;这样在一定程度上能降低被 攻击的风险&#xff0c;具体代码如…

云水画中人,独立一江秋

转载于:https://blog.51cto.com/wuliguo/50014

python是c语言_python与c语言

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; python语言调用c语言进行扩展&#xff0c;或者增加程序的运行速度都是特别方便的。 同时还能获得与c或者c几…

aes算法实现c语言_以C语言实现归并排序为例,谈谈五大常用算法之一的“分治法”...

分治算法&#xff0c;顾名思义就是“分而治之”&#xff0c;即把规模较大的复杂问题拆分为若干规模较小的类似子问题&#xff0c;并逐个解决&#xff0c;最后再将各个子问题的解决结果合并&#xff0c;得到原始问题的结果的方法。这个技巧是很多高效算法的基础&#xff0c;例如…

一朝读码深似海,不读源码薪难升!读懂.NET5源码,到底多重要?

谈到源码分析&#xff0c;很多人会有这样的疑问&#xff1a;“.NET5的基本功能我已经掌握了&#xff0c;还有读源码的必要吗&#xff1f;”实际上&#xff0c;阅读源码不仅能够帮你更深刻地理解底层设计原理&#xff0c;提升你的系统架构能力和编码功力&#xff0c;还能让你知道…

使用SQL语句获取SQL Server数据库登录用户权限

返回一个报表&#xff0c;报表中包含当前数据库中某对象的用户权限或语句权限的信息。语法sp_helprotect [ [ name ] object_statement ][ , [ username ] security_account ][ , [ grantorname ] grantor ][ , [ permissionarea ] type ]参数[name ] object_statement是当…

如何在 ASP.Net Core 使用 分布式缓存

ASP.Net Core 提供了多种类型的缓存&#xff0c;除了内存缓存和响应缓存之外&#xff0c;还提供了对 分布式缓存 的支持。在之前的一篇文章中&#xff0c;我讨论了 ASP.Net Core 的内存缓存。在本文中&#xff0c;我们将讨论如何在 ASP.Net Core 中使用分布式缓存&#xff0c;本…

50万数据生成6位数不重复字符串_R语言系列3:高级数据管理

R语言系列3&#xff1a;高级数据管理此文内容为《R语言实战》的笔记&#xff0c;人民邮电出版社出版。从高中电脑课学VB开始&#xff0c;大一课内开始学习C&#xff0c;到后来大二为了数模学习Matlab&#xff0c;到大三为了搞深度学习自学Python&#xff0c;到研究生之初学习St…

ぁ。。。爱。。。ぁ

有一老夫妻年逾50.经济条件不错&#xff0c;理当是安享退休的时候&#xff0c;却一起到律师那要办离婚。原因是自从结婚以来&#xff0c;两人争吵不断&#xff0c;老是意见不合。个性上又南辕北辙十分不和谐。二十多年的婚姻生活&#xff0c;要不是为了孩子着想&#xff0c;早就…

python对象_查找Python对象具有的方法

您似乎可以使用此代码,将“对象”替换为您感兴趣的对象&#xff1a; object_methods [method_name for method_name in dir(object) if callable(getattr(object, method_name))] 我在this site发现它.希望这应该提供更多细节&#xff01; 对于那些获得AttributeErrors的人&am…

fcn网络训练代码_另辟蹊径,中科院自动化所等首次用图卷积网络解决语义分割难题...

使用 CNN 处理图像问题已经是常规操作&#xff0c;但此类方法会造成局部位置信息的损失。如何解决这个问题呢&#xff1f;来自中科院自动化所和北京中医药大学的研究者另辟蹊径&#xff0c;提出用图卷积网络解决语义分割问题。选自arXiv&#xff0c;作者&#xff1a;Yi Lu等&am…

盘点大厂的那些开源项目 - 小米科技

小米是一家以手机、智能硬件和IoT平台为核心的互联网公司&#xff0c;以智能手机、智能电视、笔记本等丰富的产品与服务。致力于让全球每个人都能享受科技带来的美好生活。“为发烧而生”是小米的产品概念。“让每个人都能享受科技的乐趣”是小米公司的愿景。小米公司应用了互联…

python做一个单项选择题系统_(完整版)python选择题word打印版

Python 单选题库 一、 python 语法基础 1 、 Python 3.x 版本的保留字总数是 A.27 B.29 C.33 D.16 2. 语言保留字的是 Python 不是 &#xff0c; 以下选项中 A while B pass C do D except 3. 以下选项中描述错误的是 &#xff0c; 程序格式框架 Python 关于 A Python 语言不采…