数据在域驱动设计中传递层之间的对象

bar*_*oma 9 c# java architecture domain-driven-design dto

在此输入图像描述

域层通过数据传输对象(DTO)与其他层进行通信.我对DTO感到困惑.

DTO 1位于域和表示层之间.

DTO 2位于域和数据层之间.

我应该在图层之间创建两个不同的DTO对象还是仅创建一个DTO.专业方式是哪种?

Ily*_*kin 6

让我们浏览所有图层:

  • 数据访问层(DAL).它用于从数据库(DB)获取数据.

通常它知道Domain Entities和域层.

DAL可以返回Domain EntitiesDTOs (DB oriented data structures).view models如果需要,可以使用这些DTO或域实体来构建表示层()的DTO .

域实体通常很繁重,需要数据映射器或任何ORM.我更喜欢使用Domain Entities,映射它们并避免使用其他DTO.否则也应该映射DTO.

  • 域层(域模型).它用于表示业务实体及其行为,业务规则,纯业务逻辑.

域层应该对实体存储在某处的方式一无所知(例如在DB中).它可以有自己的DTO,它可以是重构引入参数对象的结果.

  • 表示层(UI).它用于向用户呈现UI.

它应该知道Data Access Layer从DB加载数据并即将Domain Layer访问其业务逻辑.

它可以有自己的DTO - 视图模型,它们是域实体或DB友好DTO的用户界面友好表示.表达层的责任是了解view models.

如果您只有一个演示文稿,您的Application Infrastructure也可以作为表示层的一部分实现,但通常它是一个单独的应用程序层.

在此输入图像描述


Szy*_*mon 2

这实际上取决于您的具体需求。

一般来说,您应该创建 2 组 DTO。这可以更好地解耦不同层,并使系统的架构更加灵活。具体原因或需要的情况例如:

  • 共享DTO 可能是不可能的,例如因为所使用的技术存在差异,例如Web 服务和数据层是用C# 编写的,而表示层是用Java 编写的。
  • DTO 不一定相同,即用于与数据库层交互的 DTO 可能会根据数据库结构进行建模,但您可能会以不同的方式将其公开给表示层。

话虽如此,如果您可以忍受拥有一组 DTO 的限制,并且如果它适合您的需求,您可以共享它们,因为它会产生更少的需要编写和维护的代码。