DDD

基于ABP实现DDD--领域逻辑和应用逻辑

本文主要介绍了多应用层的问题,包括原因和实现。通过理解介绍了如何区分领域逻辑和应用逻辑,哪些是正确的实践,哪些是不推荐的或者错误的实践。 一.多应用层的问题 1.多应用层介绍 不知道你们是否会遇到一种情况,通过ABP构建了一个后端的API项目,刚开始是为Web端项目(比如,Vue)提供后端接口服务的 ... »

shengshengwang

基于ABP实现DDD--实体创建和更新

本文主要介绍了通过构造函数和领域服务创建实体2种方式,后者多用于在创建实体时需要其它业务规则检测的场景。最后介绍了在应用服务层中如何进行实体的更新操作。 一.通过构造函数创建实体 假如Issue的聚合根类为: public class Issue : AggregateRoot<Guid> { pu ... »

shengshengwang

基于ABP实现DDD--领域服务、应用服务和DTO实践

什么是领域服务呢?领域服务就是领域对象本身的服务,通常是通过多个聚合以实现单个聚合无法处理的逻辑。 一.领域服务实践 接下来将聚合根Issue中的AssignToAsync()方法[将问题分配给用户],剥离到领域服务当中。如下: // ABP当中的领域服务类通常都是以Manager结尾的 publi ... »

shengshengwang

基于ABP实现DDD--仓储实践

由于软件系统中可能有着不同的数据库,不同的ORM,仓储思想的本质是解耦它们。在ABP中具体的实现仓储接口定义在领域层,实现在基础设施层。仓储接口被领域层(比如领域服务)和应用层用来访问数据库,操作聚合根,聚合根就是业务单元。这篇文章主要分析怎么通过规约将业务逻辑从仓储实现中剥离出来,从而让仓储专注于 ... »

shengshengwang

可落地的DDD(7)-战术设计上的一些误区

几年前我总结过DDD战术设计的一些可落地的经验,现在回过头来发现,当初对这些概念的理解还是没有到位。比如战术设计的各个模块是如协作的。哪些是问题空间问题,哪些是解方案空间问题 这篇文章重新阐述下。 ... »

stoneFang

DDD:关于模型的合法性,Entity.IsValid()合理吗?

背景 见过很多框架(包括我自己的)都会在实体的定义中包含一个IsValid()方法,用来判断实体的合法性,是否应该这样设计呢?本文就这个问题介绍一点想法,希望大家多批评。 实体能否处于“非法”状态? 实体是否应该包含IsValid()方法的深层次问题是:“实体能否处于非法状态?”。我们来定义一些术语,接下来我就引用这些术语: A模式:实体允许处于非法状态,但是实体要包含一个IsValid()方法 »

阿里高级技术专家谈开源DDD框架:COLA4.0,分离架构和组件

COLA: Clean Object-oriented &amp;amp; Layered Architecture    https://github.com/alibaba/COLA/   前几天和几个饿了么的同学聊天,一听说他们还在用COLA 1.0,我二话没说,90度鞠躬,赔礼道歉,虚心聆听他们的吐槽。COLA的初衷旨在控制复杂度,救码农于水火,惭愧的是,早期的思想不成熟,设计也多有缺陷,不仅没帮 »

DDD与Repository

p { text-indent: 2em } Repository已经不是什么新鲜概念了。DDD模型自2004年提出,发展至今已经16年了。但是不少企业却无法实施,其原因也很简单:DDD是基于需求的,而很多并不理解需求;DDD是容易实现的,而很多设计者并不会编程。这种情况就有一些两头不讨好,而如果有办法结合统一的话,则会非常好用。   学习Repository的过程中,最先要进行的是思想的转变。在 »

实现领域驱动设计 - 使用ABP框架 - 创建实体

用例演示 - 创建实体 本节将演示一些示例用例并讨论可选场景。 创建实体 从实体/聚合根类创建对象是实体生命周期的第一步。聚合/聚合根规则和最佳实践部分建议为Entity类创建一个主构造函数,以保证创建一个有效的实体。因此,无论何时我们需要创建实体的实例,我们都应该使用那个构造函数 参见下面的问题聚 ... »

(DDD)仓储的思考 (DDD)仓储的思考 Repository 返回 IQueryable?还是 IEnumerable? ENode简介与各种资源汇总(持续更新中。。。)

(DDD)仓储的思考 为什么需要仓储呢?领域对象(一般是聚合根)的被创建出来后的到最后持久化到数据库都需要跟数据库打交道,这样我们就需要一个类似数据库访问层的东西来管理领域对象。那是不是我们就可以设计一个类似DAL层的东东来管理对象呢?是的,但是呢设计上有点区别,就是我们不希望上层如应用层直接访问数据,我们所有的操作应该是围绕着领域对象来的,所以我们还设计了仓储接口在领域层,然后把仓储的实现放在基 »

转)Ubuntu16.04下安装DDD(Data Display Debugger)

以下转自:http://www.linuxdiyf.com/linux/26393.html   前两天在Linux论坛偶然间看到了DDD这个软件,根据介绍是一个gdb界面化的调试软件,这正是我找了好长时间的东西,有一个有界面的调试工具了,于是乎今天抽了个时间整了整,里面碰到了不少问题,下面一一说明一下。我使用的Ubuntu16.04,如果你使用的是CentOS可以参考:http://www.li »

DDD领域驱动设计

编程思想的升级 POP---面向过程编程   首先说一个比较经典的场景,怎么把大象装进冰箱里面?第一步,打开冰箱门,第二步,把大象装进冰箱,第三步,关上冰箱门。到此结束。考虑问题的方式是123456。   POP是一种线性思维,简单,无法应对复杂情况。比如,建房子的时候,我们只要考虑地基--墙--门窗--房顶。 OOP---面向对象编程   面向对象编程特点,封装继承和多态。还是上面那个把大象装进 »

DDD领域模型之分配权限(十三)

权限分配和权限查找。 在DDD.Domain工程中新建:BAS_PermissionAssign类 public partial class BAS_PermissionAssgin:AggreateRoot { private IRepository&amp;lt;BAS_PermissionAssgin&amp;gt; irepository; public BAS_ »

DDD分层架构之领域实体(验证篇) DDD分层架构之领域实体(验证篇)

 在应用程序框架实战十四:DDD分层架构之领域实体(基础篇)一文中,我介绍了领域实体的基础,包括标识、相等性比较、输出实体状态等。本文将介绍领域实体的一个核心内容——验证,它是应用程序健壮性的基石。为了完成领域实体的验证,我们在前面已经准备好了验证公共操作类和异常公共操作类。   .Net提供的DataAnnotations验证方法非常强大,Mvc会自动将DataAnnotations特性转换为客 »

DDD领域驱动设计仓储Repository DDD领域驱动设计初探(二):仓储Repository(上) C#进阶系列——DDD领域驱动设计初探(一):聚合 C#进阶系列——MEF实现设计上的“松耦合”(终结篇:面向接口编程)

前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原因无非以下两点:一是Repository的真实意图没有理解清楚,导致设计的紊乱,随着项目的横向和纵向扩展,到最后越来越难维护;二是赶时髦的为了“模式”而“模式”,仓储并非适用于所有项目,这就像没有任何 »

DDD分层架构之值对象(层超类型篇) DDD分层架构之值对象(层超类型篇)

上一篇介绍了值对象的基本概念,得到了一些朋友的支持,另外也有一些朋友提出了不同意见。这其实是很自然的事情,设计本来就充满了各种可能性,没有绝对正确的做法,只有更好的实践。但是设计与实践的好与坏,对于不同的人,以及处于不同的环境都有不同的诠释,这是一个仁者见仁,智者见智的问题。DDD非常抽象,以至于它的每一个概念,对于不同的人都有不同的看法,更何况基于DDD的.Net实践,就更难分辨哪一个用法更标准 »

Spring Boot+JPA实现DDD(三)

构建多对多关系 上一篇我们有了Product这个聚合根。前面已经分析过,一个商品可以包含一个或多个课程明细。课程明细可以单独编辑,有自己的生命周期,课程明细也是一个聚合根。 在domain.model包下创建 courseitem.CourseItem类,内容如下: @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTE »