应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

领域驱动设计DDD的一点理解

7907人阅读 2020/10/11 17:00 总访问:5182517 评论:0 收藏:0 手机
分类: 软件架构

有人误认为项目架构中加入xxRepository,xxDomain,xxValueObject就变成了DDD架构。如果没有悟出其精髓就在项目中加入这些概念,那充其量也不过是个三层架构;反之对于一个面向对象分析的高手而言,不使用这些概念也可以实现领域驱动设计。

一个IUserRepository是一个Repository,方法List GetRules(int id)将此Repository打回了原形,这不再是一个Repository,这是一个DAL。

领域驱动,以领域为中心设计,而不是数据为中心。

所以很多人以为用了Repository,Domain这些就是领域驱动,其实不是的,db first的方式还是以数据为中心。先设计领域,先想逻辑,不要管数据库,可以先写领域代码在抽象数据库。

学生在学校的时候从刚开始写代码就开始学习各种设计模式各种数据结构,但是很少有机会用过?因为你所写的代码无时无刻不耦合着数据库。数据库操作作为一种实现细节掺杂在你的代码中,所以领域驱动设计就是为了讲解这种问题的

DDD中的Repository模式

Repository模式也称存储库模式或仓储模式,根据Eric Evans的《领域驱动设计》一书,“存储库是一种封装存储,检索和搜索行为的机制,它模仿对象的集合。”
同样,根据企业应用程序体系结构的模式,它“使用类似集合的接口访问域对象,在域和数据映射层之间进行中介”。
换句话说,存储库还处理数据并隐藏类似于DAO的查询。但是,它处于更高的层次,更接近应用程序的业务逻辑。

Repository模式又称为仓储模式或存储库模式,替代以前的DAO模式,存储库模式限制我们在应用程序直接使用数据库的数据。

Repository设计原则
  • 出参入参不应该使用底层数据格式:
    需要记得的是 Repository 操作的是 Entity 对象(实际上应该是Aggregate Root),而不应该直接操作底层的 DO 。更近一步,Repository 接口实际上应该存在于Domain层,根本看不到 DO 的实现。这个也是为了避免底层实现逻辑渗透到业务代码中的强保障。

  • 不要在仓储内控制事务:
    你的仓储用于管理的是单个聚合,事务的控制应该取决于业务逻辑的完成情况,而不是数据存储与更新情况。

数据驱动的方式开始很简单,随着业务越来越复杂


领域驱动最开始做的事情就比较多,设计模式面试对象分析,领域驱动会麻烦一些,这些确定好了在提取数据库

编码的过程中,一些业务与流程完全是与数据无关的,数据库仅仅起到了持久化的任务,数据从业务逻辑中抽离。

建议的n层架构高层次图


最上层是提供接口了,最下面是基础设置层,基础设施层每一层都可以直接访问它,都能有箭头直接指下来。

DDD落地实现离不开Clean架构、六边形架构、 CQRS、Event Source几大大相关领域。下图是传统以数据库为中心的架构与使用DDD实现以领域为中心架构的区别。

DDD专门为解决复杂性而诞生,因此解决思路完全不同于传统的CRUD,但是DDD本身掌握起来并不会感觉复杂,从程序员角度看,DDD其实是研究将包含业务逻辑的ifelse语句放在哪里的学问。


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

领域驱动设计DDD ABP VNext 一:项目架构搭建,模块使用

[TOC]用户接口层改造nuget中下载abp依赖VoLo.Abp.AspNetCore.Mvc ItemGroup添加方式 <ItemGroup> <Packa...

领域驱动设计DDD之Repository

DDD中的Repository模式Repository模式也称存储库模式或仓储模式,根据Eric Evans的《领域驱动设计》一书,“存储库是一种封...

领域驱动设计DDD ABP VNext 二:使用仓储

[TOC]领域驱动设计仓储介绍在领域层和数据映射层之间进行中介,使用类似集合的接口来操作领域对象.” (Martin Fowler)。 实...

领域驱动设计DDD ABP VNext 三:领域模型 之 失血模型,贫血模型,充血模型,胀血模型

[TOC]领域模型分为:失血模型,贫血模型,充血模型,胀血模型。 一、失血模型传统的三层架构,实体对象就是简单的POJO或者...

领域驱动设计,概念的理解

[TOC]领域服务(Domain Service)领域中的一些概念不太适合建模为对象,即归类到实体对象或值对象,因为它们本质上就是一些...

DDD介绍

领域服务(Domain Services)领域中的一些概念不太适合建模为对象,即归类到实体对象或值对象,因为它们本质上就是一些操作,...

深入理解DDD的聚合模式

[TOC]DDD中的聚合模式是最难弄清楚的一种模式,在如何确定聚合边界这个问题上,更没有一个明确的指导原则,这导致DDD的落地...

领域启动设计DDD 应用服务与领域服务区别

1.领域服务和Application Services 是不同的,Application Services 返回的是DTO,而领域服务返回的是领域对象(实体或者值...

领域启动设计DDD 领域服务与应用服务的区别

在这篇文章中,我们将看一下领域域服务与应用服务有什么不同。 人们常说,领域服务是承载那些不自然地适合实体和值对象的...

基础领域驱动DDD框架搭建,配合sqlsugar基础架构搭建。使用仓储。.net使用Autofac实现自动注入。通过特性封装事务,特性实现工作单元

[TOC]一:创建一个WebApi项目随便取名一个,比如TeacherCertificationAPI效果如下: 顺便在appsettings.json中配置一下...

c异步编程taskasyncawait的一点理解

我们使用异步编程可以自己开辟线程,也可以使用async,await关键字来实现例如我们在主线程直接执行一个方法是会阻塞主线程的...

对EF状态System.Data.EntityState的一点理解

System.Data.EntityState一共有五种状态分别是Added,Deleted,Modified,UnChanged,Detached下面给一个简单的解释System.Data...