领域层

•实体

•仓储

•领域服务

•工作单元(下期)

•领域事件(事件总线)(下期)

•实体是DDD(领域驱动设计)的核心概念之一。

•Eirc Evans是这样描述的实体的:“它根本上不是通过属性定义的,而是通过一系列连续性(continuity)和标识(identity)定义的”。

•因此,实体都有Id属性并且都存储到数据库中。

•一个实体一般会映射到数据库的一张表。

在ABP中,实体派生自Entity类,Entity默认是int(int32)

对仓储的定义:

•位于领域层和数据映射层之间,使用类似集合的接口来访问领域对象。

•在实践中,仓储是执行领域对象(实体和值对象)的数据库操作。一般地,一个分离的仓储用于一个实体(或者聚合根)。

IRepository接口

在ABP中,一个仓储类应该实现一个IRepository接口。为每一个仓储定义一个接口是一个好的做法。

IRepository接口:查询

获得单个实体

IRepository接口:查询

获得多个实体

IRepository接口:插入

获得多个实体

注:Insert、InsertOrUpdate 方法不会即时执行到数据库。只有带 AndGetId 的方法才会即时执行到数据库。

当工作单元完成时才统一执行到数据库。

IRepository接口:更新、删除

注:更新、删除方法不会即时执行到数据库。

当工作单元完成时才统一执行到数据库。

IRepository接口:使用

IRepository接口:最佳实践

•仓储类应该是无状态的。这意味着,你不应该定义仓储级别的状态对象,而且一个仓储方法调用不应该影响其他的调用。

•自定义仓储方法不应该包含业务逻辑或者应用逻辑,而应该只执行数据相关的或者orm特定的任务。

•当仓储使用依赖注入时,给其他服务定义更少的或者不要定义依赖。

领域服务(或DDD中的服务)用于执行领域操作和业务规则。Eric Evans描述了一个好的服务应该具备下面三个特征:

1.和领域概念相关的操作不是一个实体或者值对象的本质部分。

2.接口定义在领域模型其他元素的条款中。

3.操作是无状态的。

跟获得或返回一个数据传输对象的应用服务方法(DTO)不同,领域服务获得或者返回一个领域对象(比如实体或值类型)。

一个领域服务可以用于应用服务,也可以用于其他的领域服务,但不能直接用于展现层,服务层才直接用于展现层。

IDomainService接口和DomainService类

1.ABP定义了IDomainService接口,所有的领域服务都按照惯例实现了该接口。当实现时,领域服务会以transient自动注册到依赖注入系统。

2.此外,领域服务(可选地)可以从DomainService类继承。因此,它可以使用一些继承的属性,比如logging,本地化等等。当然,如果没有继承,如果需要的话也可以注入这些属性。

讨论:

为什么不使用应用服务实现领域服务中的逻辑呢?

我们可以简单地说,它不是应用服务要干的活。因为领域逻辑不是一个用例(use-case),而是一个 业务操作。我们可以在不同的用例中使用相同的“将一个任务派给一个人”的逻辑。比如说我们以后会更新这个任务,并且将这个任务派给其他人。

因此,我们可以使用相同的领域逻辑,这个逻辑就是“将一个任务派给一个人”,我们不用考虑这个具体的人和具体的任务。此外,我们可能有两个不同的UI(一个移动端应用和一个web应用)来共享相同的领域。

如何强制使用领域服务:

开发这个应用服务的开发者可能不知道存在一个TaskDomainService,而且可以直接将给定的 PersonId设置给任务的 AssignedPersonId。那么,如何阻止他这样做呢?

回顾

•实体:定义实体常用的几种基类  Entity、CreationAuditedEntity、AuditedEntity、FullAuditedEntity、IPassivable、AggregateRoot

•仓储:仓储提供数据层常用的操作方法,仓储的定义与使用方式,仓储使用的最佳实践和建议。

•领域服务:领域服务存在的意义、职责,如何定义一个领域服务。

jpadao层继承什么_ABP框架领域层相关推荐

  1. 殷浩详解DDD:领域层设计规范

    简介: 在一个DDD架构设计中,领域层的设计合理性会直接影响整个架构的代码结构以及应用层.基础设施层的设计.但是领域层设计又是有挑战的任务,特别是在一个业务逻辑相对复杂应用中,每一个业务规则是应该放在 ...

  2. DDD系列第四讲:领域层设计规范

    在一个DDD架构设计中,领域层的设计合理性会直接影响整个架构的代码结构以及应用层.基础设施层的设计.但是领域层设计又是有挑战的任务,特别是在一个业务逻辑相对复杂应用中,每一个业务规则是应该放在Enti ...

  3. DDD :领域层设计规范

    在一个DDD架构设计中,领域层的设计合理性会直接影响整个架构的代码结构以及应用层.基础设施层的设计.但是领域层设计又是有挑战的任务,特别是在一个业务逻辑相对复杂应用中,每一个业务规则是应该放在Enti ...

  4. ABP领域层——实体

    ABP领域层--实体 阅读目录 ABP领域层--实体 实体类(Entity classes) 接口约定 IEntity接口 回到目录 ABP领域层--实体 基于DDD的现代ASP.NET开发框架--A ...

  5. [单片机框架][drivers层][cw2015] fuelgauge 硬件电量计(二)

    接上一篇:[单片机框架][device层] fuelgauge 电量计 [单片机框架][drivers层][cw2015] fuelgauge 硬件电量计(一) 本章是硬件电量计的使用方法,采用IIC ...

  6. ABP入门系列(3)——领域层定义仓储并实现

    一.先来介绍下仓储 仓储(Repository): 仓储用来操作数据库进行数据存取.仓储接口在领域层定义,而仓储的实现类应该写在基础设施层. 在ABP中,仓储类要实现IRepository接口,接口定 ...

  7. Abp vnext Web应用程序开发教程 6 —— 作者:领域层

    文章目录 关于本教程 下载源代码 介绍 作者实体 AuthorManager:领域服务 IAuthorRepository 结论 下一部分 关于本教程 本教程基于版本3.1 在本教程系列中,您将构建一 ...

  8. [Abp vNext 源码分析] - 5. DDD 的领域层支持(仓储、实体、值对象)

    一.简要介绍 ABP vNext 框架本身就是围绕着 DDD 理念进行设计的,所以在 DDD 里面我们能够见到的实体.仓储.值对象.领域服务,ABP vNext 框架都为我们进行了实现,这些基础设施都 ...

  9. ABP入门系列(2)——领域层创建实体

    这一节我们主要和领域层打交道.首先我们要对ABP的体系结构以及从模板创建的解决方案进行一一对应.网上有代码生成器去简化我们这一步的任务,但是不建议初学者去使用. 一.首先来看看ABP体系结构 ABP体 ...

最新文章

  1. 【做题记录】Codeforces做题记录
  2. 去除git mergetool不产生*.orig文件
  3. Anti-Aliasing SSAA MSAA MLAA SRAA 简介
  4. FAT和EXFAT文件系统
  5. .Net水晶报表的使用总结
  6. java excel添加公式_Java添加、读取Excel公式
  7. 返回路径平面上的间隙_返回电流及其与通孔的关系
  8. 付出与收获对等的自然法则,执行力离开去做马上去做
  9. code函数oracle列子,Oracle Pivot函数语法详解及应用实例
  10. 常见电平信号、RS232与RS485相关知识总结
  11. 第一章 Python数据模型
  12. 【渝粤教育】电大中专营销策划原理与实务 (3)作业 题库
  13. Gym 100818 F Irrational Roots (数学)
  14. linux网络设备驱动(一)
  15. 大家查找医疗英文文献都去哪个网?
  16. 自适应学习系统_如何建立适应性学习系统
  17. Java大作业之餐厅管理系统
  18. Resource Acquisition Is Initialization
  19. 网易服务器修改权限等级,网易七鱼客服管理_七鱼客服管理人员权限设置_企业服务汇...
  20. 视频编辑器GoPro Quik for mac中文版

热门文章

  1. cocostuff10k数据集介绍_COCO数据集整理
  2. 启停系统错误_关掉自动启停系统,就可以用普通蓄电池代替启停蓄电池吗?
  3. SpringBoot定义统一的controller返回格式
  4. 帝国cms会员充值交易推广分润系统的界面实现与开发记录
  5. nanodet onnx踩坑记录
  6. 中山大学提出SimAM:无参Attention!助力分类/检测/分割涨点!
  7. pytorch volatile 和 requires_grad
  8. cuda nvcc dll
  9. 如何把OpenCV Python获取的图像传递到C层处理
  10. pip 系统无法将文件移到不同的磁盘驱动器 的问题