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

10

在此输入图片描述

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

DTO 1在领域层和表示层之间。

DTO 2在领域层和数据层之间。

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


1
领域层不应该知道关于数据层的任何信息,即使它是数据访问层。 - Ilya Palkin
4个回答

6

让我们逐层了解:

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

通常情况下,它知道领域实体和领域层。

DAL 可以返回 领域实体DTOs(面向数据库的数据结构)。如果需要,这些 DTOs 或领域实体可以用于构建演示层的 DTOs(视图模型)。

领域实体通常比较复杂,需要 data mappers 或任何 ORM。我更喜欢使用领域实体,将其映射并避免其他 DTOs。否则,DTOs 也应该被映射。

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

领域层不应该知道实体存储的方式(例如在数据库中)。它可以拥有自己的DTO,这些DTO可以是重构引入参数对象的结果。

  • 表示层(UI)。它用于向用户展示界面。

它应该知道数据访问层来从数据库加载数据,并且知道领域层以便访问其业务逻辑。

它可以拥有自己的DTO - 视图模型,这些视图模型是领域实体或数据库友好DTO的用户界面友好表示。了解视图模型是表示层的责任。

如果您只有一个表示层,则应用程序基础结构也可以作为表示层的一部分实现,但通常它是单独的应用程序层。

enter image description here


2
这真的取决于您的特定需求。一般来说,应该创建2组DTO。这样可以更好地解耦不同的层,使系统架构更加灵活。需要使用它的具体原因或情况例如:
  • 共享DTO可能是不可能的,例如由于使用的技术有差异,例如Web服务和数据层是用C#编写的,而表示层是用Java编写的。
  • DTO并不一定相同,即与数据库层交互的DTO可能是基于数据库结构建模的,但是您可以以不同的方式将其公开给表示层。
话虽如此,如果您可以忍受只有一组DTO的限制,则可以根据需要共享它们,因为这会产生更少的代码编写和维护。

DTO2类应该放在哪里?在领域层还是另一个特定的类库中? - barteloma
1
最好放在一个单独的库中。这样可以更好地实现分离和灵活性。 - Szymon

1
你的图片展示了两个名为DTO1和DTO2的DTO对象。
DTO1在表示层和领域层之间共享数据。您可以将它们称为ViewModel类。
DTO2在领域层和数据层之间共享数据。您可以将它们称为数据传输对象(DTOs)。
因此,您可以使用两个不同的传输对象。

0

如果我们假设您使用两个分离的DTO(DTO1和DTO2),
答案很简单:

在这种情况下,您必须创建两个独立的DTO:DTO1和DTO2。
即使它们是相同的,也应该实现为分离的类。

这是因为DTO1是在域层中创建的,而DTO2是在数据层中创建的(根据您的图片)。

请注意,在某些解决方案中,不使用两个DTO-有时只有一个DTO。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接