- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我问你谁知道并有使用任何分层架构(洋葱、六边形、干净等)构建软件的经验。每当我在谷歌上搜索软件架构时,人们都会有不同的观点,并以不同的方式解释相同的架构。
条款
在您阅读问题之前,有些术语可能会让您感到困惑,因此我将在下面对其进行定义。我不确定我是否对它们有“正确”的定义,但我从互联网上收集了这些信息。如果我有误解,请告诉我。
领域层 :包含企业/业务逻辑并使用域模型。位于中心并且不依赖于除领域模型之外的任何其他层。
应用层 : 包含应用逻辑,从基础设施层接受DTO,传递View Model
DTO(数据传输对象) : 一个类,JSON 字符串等,用于在层与层之间传输数据。可能是一个纯数据容器。
VM(查看模型) :从应用层传递到表示层的DTO。
DO(域模型) : 域层中使用的类、JSON 字符串等。可能是一个纯数据容器。
VO(值对象) :数据库实体(数据库行),或数据库使用的数据格式。可以从数据库层转移到应用层。
总结
在洋葱、六边形或简洁架构中,域层位于中心(即域层不依赖于域模型以外的任何层,域模型用于将数据传输到其他层或从更高层接受数据)。
这意味着域使用的域模型(DTO、POJO、VO 或其他)可能与数据库用于保存持久数据的模型不同。
我画了一个图表,以便我可以给你更好的解释。
第一季度 :
请看第二张图片的红色部分。
与传统的分层或 n 层架构不同,如果领域层位于中心,那么领域模型是否可以拥有比数据库实体(行)更多的属性(或不同的属性)?
例如,假设领域层使用一个名为 的类。人 .用户请求所有在服务器中注册的人的照片。让我们假设数据库只包含所有人的姓名。但是,我们可能会使用其他网络服务器通过姓名请求某人的照片。所以应用层会从数据库中读取所有的名称,并通过这些名称,通过 HTTP 请求从其他 Web 服务器获取所有图片。之后,列表人 带有名称和图片的将作为 View 模型 (DTO) 发送给用户。
Q2 :
持久层可能由数据库、文件系统、其他 Web API 等组成。
表示层可以是网站、桌面应用、移动应用、Web API 等。
这两层都是基础设施层的一部分,都依赖于应用层,而应用层只依赖于领域层。
当应用层接受来自表现层的请求时,没有问题,因为表现层调用应用层,表现层知道应用层。
大多数时候,应用层需要从持久层获取数据。
应用层无法在没有任何依赖的情况下调用持久层,因为它不知道持久层中的任何类。
这就是我目前的理解,谁能给我一个清晰的解释,数据应该如何流动以及从低层到高层的通信是如何完成的?
对于那些想写代码的人,我更喜欢 C#。
最佳答案
Q1: > can the domain model have more properties (or different properties) than the database entity (row)?
There is no way that the application layer can call the persistence layer without having any dependency, because it does not know any classes in the persistence layer.
This is how I am understanding so far, can someone give me a clear explanation how the data should flow and how the communication is done from the lower layer to the higher layer?
+-----+ f() +-----+
| A | -----> | B |
+-----+ +-----+
有一个类
A
调用方法
f
上课
B
.
using B
在类
A
.如果您使用的是 java,它将是
import B
.不管你使用什么编程语言。类(class)名称
B
将出现在
A
.
using
或
import
声明它意味着编译器知道。因此你有一个
编译时依赖
A
->
B
.
A
->
B
.
+-----+ f() +------------+ +-------+
| A | -----> | BInterface | <---- | BImpl |
+-----+ +------------+ +-------+
在这种情况下
A
依赖于前者的抽象
B
我在这里打电话
BInterface
并且实现被移动到一个类
BImpl
实现那个接口(interface)。
A
进入方法
f
的
BImpl
,但在
编译时间
A
和
BImpl
依赖
BInterface
因此来自
BImpl
的依赖至
BInterface
积分对
控制流程 .
Repository
.然后您的数据库层可以实现该
Repository
(依赖倒置)。
An interface is an abstraction and thus tells what can be done, not how it is done.
public interface PersonRepository {
// WRONG - because the where is usually a part of an SQL or JPQL
// and thus exposes the implementation.
public List<Person> findByCriteria(String where);
}
更好的方法是
public interface PersonRepository {
public List<Person> findByCriteria(PersonCriteria criteria);
}
public class PersonCriteria {
private String firstName;
private MatchMode firstNameMatchMode; // something like STARTS_WITH, ENDS_WITH, CONTAINS
// setters omitted
}
您可能想要实现更复杂的标准,但始终牢记永远不要公开实现细节。
关于software-design - 在洋葱、六边形或简洁架构中,域模型是否可以包含与数据库中的域模型不同的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63738349/
可不可以命名为MVVM模型?因为View通过查看模型数据。 View 是否应该只与 ViewModelData 交互?我确实在某处读到正确的 MVVM 模型应该在 ViewModel 而不是 Mode
我正在阅读有关设计模式的文章,虽然作者们都认为观察者模式很酷,但在设计方面,每个人都在谈论 MVC。 我有点困惑,MVC 图不是循环的,代码流具有闭合拓扑不是很自然吗?为什么没有人谈论这种模式: mo
我正在开发一个 Sticky Notes 项目并在 WPF 中做 UI,显然将 MVVM 作为我的架构设计选择。我正在重新考虑我的模型、 View 和 View 模型应该是什么。 我有一个名为 Not
不要混淆:How can I convert List to Hashtable in C#? 我有一个模型列表,我想将它们组织成一个哈希表,以枚举作为键,模型列表(具有枚举的值)作为值。 publi
我只是花了一些时间阅读这些术语(我不经常使用它们,因为我们没有任何 MVC 应用程序,我通常只说“模型”),但我觉得根据上下文,这些意味着不同的东西: 实体 这很简单,它是数据库中的一行: 2) In
我想知道你们中是否有人知道一些很好的教程来解释大型应用程序的 MVVM。我发现关于 MVVM 的每个教程都只是基础知识解释(如何实现模型、 View 模型和 View ),但我对在应用程序页面之间传递
我想realm.delete() 我的 Realm 中除了一个模型之外的所有模型。有什么办法可以不列出所有这些吗? 也许是一种遍历 Realm 中当前存在的所有类型的方法? 最佳答案 您可以从您的 R
我正在尝试使用 alias 指令模拟一个 Eloquent 模型,如下所示: $transporter = \Mockery::mock('alias:' . Transporter::class)
我正在使用 stargazer 创建我的 plm 汇总表。 library(plm) library(pglm) data("Unions", package = "pglm") anb1 <- pl
我读了几篇与 ASP.NET 分层架构相关的文章和问题,但是读得太多后我有点困惑。 UI 层是在 ASP.NET MVC 中开发的,对于数据访问,我在项目中使用 EF。 我想通过一个例子来描述我的问题
我收到此消息错误: Inceptionv3.mlmodel: unable to read document 我下载了最新版本的 xcode。 9.4 版测试版 (9Q1004a) 最佳答案 您没有
(同样,一个 MVC 验证问题。我知道,我知道......) 我想使用 AutoMapper ( http://automapper.codeplex.com/ ) 来验证我的创建 View 中不在我
需要澄清一件事,现在我正在处理一个流程,其中我有两个 View 模型,一个依赖于另一个 View 模型,为了处理这件事,我尝试在我的基本 Activity 中注入(inject)两个 View 模型,
如果 WPF MVVM 应该没有代码,为什么在使用 ICommand 时,是否需要在 Window.xaml.cs 代码中实例化 DataContext 属性?我已经并排观看并关注了 YouTube
当我第一次听说 ASP.NET MVC 时,我认为这意味着应用程序由三个部分组成:模型、 View 和 Controller 。 然后我读到 NerdDinner并学习了存储库和 View 模型的方法
Platform : ubuntu 16.04 Python version: 3.5.2 mmdnn version : 0.2.5 Source framework with version :
我正在学习本教程:https://www.raywenderlich.com/160728/object-oriented-programming-swift ...并尝试对代码进行一些个人调整,看看
我正试图围绕 AngularJS。我很喜欢它,但一个核心概念似乎在逃避我——模型在哪里? 例如,如果我有一个显示多个交易列表的应用程序。一个列表向服务器查询匹配某些条件的分页事务集,另一个列表使用不同
我在为某个应用程序找出最佳方法时遇到了麻烦。我不太习惯取代旧 TLA(三层架构)的新架构,所以这就是我的来源。 在为我的应用程序(POCO 类,对吧??)设计模型和 DAL 时,我有以下疑问: 我的模
我有两个模型:Person 和 Department。每个人可以在一个部门工作。部门可以由多人管理。我不确定如何在 Django 模型中构建这种关系。 这是我不成功的尝试之一 [models.py]:
我是一名优秀的程序员,十分优秀!