实现领域驱动设计 - 使用ABP框架 - 通用准则
在进入细节之前,让我们看看一些总体的 DDD 原则
数据库提供者 / ORM 无关性
领域和应用程序层应该与 ORM / 数据库提供程序 无关。它们应该只依赖于 Repository 接口,而 Repository 接口不使用任何 ORM 特定的对象
下面说明这一原则的主要原因:
- 为了使您的 领域/应用程序 独立于 基础设施,因为基础设施可能在将来更改,或者您可能需要支持第二种数据库类型
- 通过将基础设施细节隐藏在存储库后面,使您的 领域/应用程序 专注于业务代码。
- 使您的自动化测试更容易,因为在这种情况下您可以模拟存储库
根据这一原则,解决方案中的任何项目都没有引用EntityFrameworkCore项目,除了启动应用程序
关于数据库无关性原则的探讨
上述原因1,深深地影响了你的领域对象设计(尤其是实体关系)和应用程序代码。假设您正在使用 EF Core 与关系数据库。如果你想让你的应用在以后切换到 MongoDB ,你就不能使用一些非常有用的 EF Core 特性
例如:
- 你不能假设 Change Tracking,因为 MongoDB 不能这样做。因此,您总是需要显式地更新已更改的实体。
- 您不能对实体中的其他聚合使用 导航属性 (或集合),因为这对于文档数据库是不可能的。更多信息请参见“规则:仅根据Id引用其他聚合”部分
如果你认为这些功能对你很重要,并且你永远不会偏离 EF Core,我们相信这一原则是值得延伸的。我们仍然建议使用 Repository 模式来隐藏基础设施细节。但你可以假设你在设计实体关系和编写应用程序代码时使用的是 EF Core。你甚至可以从你的应用层引用 EF Core 的 NuGet 包 来直接使用异步LINQ扩展方法,比如ToListAsync() (参见 Repositories 文档中的 IQueryable & Async 操作部分来获取更多信息)
表现层技术无关性
表现层技术(UI框架)是真实应用程序中变化最大的部分之一。在设计领域层和应用层时,完全不考虑表现层技术/框架是非常重要的。这一原则相对容易实现,而ABP的启动模板使之更加容易
在某些情况下,您可能需要在应用程序层和表示层中有重复的逻辑。例如,您可能需要在两个层中重复验证和授权检查。UI层中的检查主要是为了用户体验,而应用程序层和领域层中的检查是为了安全性和数据完整性。这是非常正常和必要的
关注状态变化,而不是报告
DDD关注领域对象如何变化和交互;如何创建实体并通过保持数据完整性/有效性和实现业务规则来更改其属性
DDD忽略报告和大规模查询。这并不意味着它们不重要。如果您的应用程序没有花哨的仪表板和报告,谁会使用它呢?然而,报告是另一个主题。您通常希望使用SQL Server的全部功能,甚至使用单独的数据源(如ElasticSearch)来进行报告。您将编写优化的查询、创建索引甚至存储过程(!)。您可以自由地做所有这些事情,只要您不将它们影响到您的业务逻辑
实现领域驱动设计 - 使用ABP框架 - 通用准则的更多相关文章
- 实现领域驱动设计 - 使用ABP框架 - 什么是领域驱动设计?
前言: 最近看到ABP官网的一本电子书,感觉写的很好,翻译出来,一起学习下 (Implementing Domain Driven Design) https://abp.io/books DDD简介 ...
- 实现领域驱动设计 - 使用ABP框架 - 解决方案概览
.NET解决方案的分层 下图显示了使用ABP的 应用启动模板 创建的Visual Studio解决方案: 解决方案名称为问题跟踪,它由多个项目组成.通过考虑DDD原则以及开发和部署实践,该解决方案是分 ...
- 实现领域驱动设计 - 使用ABP框架 - 存储库
存储库 Repository 是一个类似于集合的接口,领域层和应用程序层使用它来访问数据持久性系统(数据库),以读写业务对象(通常是聚合) 常见的存储库原则是: 在领域层定义一个存储库接口(因为它被用 ...
- 实现领域驱动设计 - 使用ABP框架 - 创建实体
用例演示 - 创建实体 本节将演示一些示例用例并讨论可选场景. 创建实体 从实体/聚合根类创建对象是实体生命周期的第一步.聚合/聚合根规则和最佳实践部分建议为Entity类创建一个主构造函数,以保证创 ...
- .net core +codefirst(.net core 基础入门,适合这方面的小白阅读) 【我们一起写框架】领域驱动设计的CodeFirst框架(一)—序篇
.net core +codefirst(.net core 基础入门,适合这方面的小白阅读) 前言 .net core mvc和 .net mvc开发很相似,比如 视图-模型-控制器结构.所以. ...
- 【我们一起写框架】领域驱动设计的CodeFirst框架(一)—序篇
前言 领域驱动设计,其实已经是一个很古老的概念了,但它的复杂度依旧让学习的人头疼不已. 互联网关于领域驱动的文章有很多,每一篇写的都很好,理解领域驱动设计的人都看的懂. 不过,这些文章对于那些初学者而 ...
- 领域驱动设计业务框架DMVP
DMVP,全称DDD-MVP,是基于领域驱动设计(DDD)搭建的业务框架,整体设计符合DDD领域模型的规范,业务上达成了领域模型和代码的一一映射,技术上达成了高内聚低耦合的架构设计,开发人员不需要关注 ...
- 【DDD】使用领域驱动设计思想实现业务系统
最近新接了一个业务系统——社区服务系统,为了快速熟悉和梳理老系统的业务逻辑和代码,同时对老系统代码做一些优化,于是打算花上一个月时间不间断地对老系统服务进行重构.同时,考虑到社区业务的复杂性,想起了之 ...
- 如何使用ABP进行软件开发(2) 领域驱动设计和三层架构的对比
简述 上一篇简述了ABP框架中的一些基础理论,包括ABP前后端项目的分层结构,以及后端项目中涉及到的知识点,例如DTO,应用服务层,整洁架构,领域对象(如实体,聚合,值对象)等. 笔者也曾经提到,AB ...
随机推荐
- 安卓记账本开发学习day5之版本兼容问题
安卓5.0以上版本想要隐藏DatePicker头布局的写法比较复杂,需要一层一层隐藏 int headerId = getContext().getResources().getIdentifier( ...
- Java学习day20
一个简单的鼠标点击在窗口画点的程序 今天学习了键盘监听和Swing窗口 Swing可以理解为是AWT的升级版本,方法名字等大都相似,例如Frame和JFrame AWT如果要关闭窗口,需要使用窗口监听 ...
- JavaScript学习总结1-字符、数字
1.严格检查模式 JavaScript是一种十分随便自由的语言 1 <script> 2 console.log(i); 3 </script> 即使没有定义i变量,也能在控制 ...
- axios 内存泄漏
有一个项目需要post后台几万条数据,每次只能请求三五条,所以只能在每次请求成功后自调用这个请求函数. 但这样请求了成千上万次后,浏览器会崩溃并报出 out of Memory 错误,经查询,这是内存 ...
- k8s 新版本 部署 Ingress-nginx controller
k8s 新版本 部署 Ingress-nginx controller 本篇主要记录一下 k8s 新版本 1.23.5 中如何搭建 ingress controller 以及里面的注意项 新版本和老版 ...
- ArcGIS建筑物简化和建筑物群聚合算法实验
一.下载OSM数据 首先从OpenStreetMap官网下载我们需要的实验数据,这里我选择清华和北大校园作为本次实验数据 二.数据处理 将我们下载的实验数据导入ArcGIS.由于OSM数据是.osm格 ...
- dfs深搜
一.01背包dfs //回溯法,01背包 #include<iostream> #include<algorithm> using namespace std; const i ...
- [题解][P5206][WC2019] 数树 (op = 1)
简要题意 给定 \(n, y\). 一张图有 \(|V| = n\) 个点,现在给出两棵树 \(T_1=G(V, E_1)\) 和 \(T_2=G(V, E_2)\). 定义这两棵树的权值 \(F(E ...
- pytorch入门--土堆深度学习快速入门教程
工具函数 dir函数,让我们直到工具箱,以及工具箱中的分隔区有什么东西 help函数,让我们直到每个工具是如何使用的,工具的使用方法 示例:在pycharm的console环境,输入 import t ...
- js--promise、async 和 await 相关知识总结
前言 promise 是前端开发人员必须掌握的知识点,本文来总结一下相关学习笔记. 正文 1.什么是prommise,promise 解决了什么问题 a.promise 是什么 Promise 是承诺 ...