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

时间:2013-11-02 20:45:41

标签: c# java architecture domain-driven-design dto

enter image description here

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

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

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

我应该在图层之间创建两个不同的DTO对象还是只创建一个DTO。这是专业的方式吗?

4 个答案:

答案 0 :(得分:6)

让我们浏览所有图层:

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

通常它知道Domain Entities和域层。

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

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

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

域层应该对实体存储在某处的方式一无所知(例如在DB中)。它可以有自己的DTO,可以是重构Introduce Parameter Object的结果。

  • 演示文稿图层(UI)。它用于向用户呈现UI。

它应该知道Data Access Layer从数据库加载数据,而Domain Layer可以访问其业务逻辑。

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

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

enter image description here

答案 1 :(得分:2)

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

一般来说,你应该创建2套DTO。这样可以更好地分离不同的层,并使系统的架构更加灵活。需要它的具体原因或情况例如是:

  • 可能无法共享DTO,例如因为使用的技术存在差异,例如Web服务和数据层用C#编写,表示层用Java编写。
  • DTO不一定相同,即您与数据库层交互的DTO可以在数据库结构上建模,但您可以以不同方式将其暴露给表示层。

话虽如此,如果你能忍受一套DTO的限制,你可以分享它们,如果它符合你的需要,因为它产生更少的代码来编写和维护。

答案 2 :(得分:1)

您的图像显示了两个名为DTO1和DTO2的DTO对象。

DTO1在表示层和domian层之间共享数据。您可以将它们称为 ViewModel 类。

DTO2在域和数据层之间共享数据。您可以将它们称为数据传输对象( DTO )。

所以你可以使用两个不同的转移对象。

答案 3 :(得分:0)

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

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

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

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