我问你谁知道并且有使用任何分层架构(洋葱、六边形、干净等)构建软件的经验。每当我在谷歌上搜索软件架构时,人们都会有不同的观点,并以不同的方式解释相同的架构。
条款
在您阅读问题之前,有些术语可能会让您感到困惑,因此我在下面对其进行定义。我不确定我是否对它们有“正确”的定义,但我从互联网上收集了这些信息。如果我有误解,请告诉我。
领域层:包含企业/业务逻辑并使用领域模型。位于中心,不依赖于域模型以外的任何其他层。
应用层:包含应用逻辑,接受来自基础设施层的DTO,传递View Model
DTO(Data Transfer Object):一个类,JSON字符串等,用于在层之间传输数据。可能是纯数据容器。
VM(视图模型):从应用层传递到表示层的 DTO。
DO(Domain Model):领域层使用的类、JSON字符串等。可能是纯数据容器。
VO(值对象):数据库实体(数据库行),或数据库使用的数据格式。可以从数据库层转移到应用层。
概括
在洋葱、六边形或干净架构中,域层位于中心(即域层不依赖于域模型以外的任何层,域模型用于将数据传输到其他层或接受来自更高层的数据)。
这意味着域使用的域模型(DTO、POJO、VO 或其他)可能与数据库用于保存持久数据的模型不同。
我画了一张图,以便给你更好的解释。
Q1:
请看第二张图片的红色部分。
如果领域层在中心,不像传统的分层或n层架构,领域模型能否比数据库实体(行)拥有更多的属性(或不同的属性)?
例如,假设域层使用一个名为Person的类。用户请求在服务器中注册的所有人的照片。让我们假设数据库只包含所有人的姓名。但是,我们可能会使用其他网络服务器通过姓名请求人的照片。所以应用层会从数据库中读取所有的名字,通过这些名字,它会通过一个HTTP请求从其他web服务器获取所有的图片。之后,带有名称和图片的Person列表将作为视图模型 (DTO) 发送给用户。
Q2:
持久层可能由数据库、文件系统、其他 Web API 等组成。
表示层可能是网站、桌面应用程序、移动应用程序、Web API 等。
这两层都是基础设施层的一部分,依赖于应用层,但应用层只依赖于领域层。
当应用层在接受来自表现层的请求时,没有问题,因为表现层调用应用层并且表现层知道应用层。
大多数时候,应用层需要从持久层获取数据。
应用层不可能在没有任何依赖的情况下调用持久层,因为它不知道持久层中的任何类。
到目前为止我的理解是这样的,有人可以给我一个清楚的解释数据应该如何流动以及如何从较低层到较高层进行通信吗?
对于那些想写代码的人,我更喜欢 C#。