域层通过数据传输对象(DTO)与其他层进行通信。我对DTO感到困惑。
DTO 1位于域和表示层之间。
DTO 2位于域和数据层之间。
我应该在图层之间创建两个不同的DTO对象还是只创建一个DTO。这是专业的方式吗?
答案 0 :(得分:6)
让我们浏览所有图层:
通常它知道Domain Entities
和域层。
DAL可以返回Domain Entities
或DTOs (DB oriented data structures)
。如果需要,可以使用这些DTO或域实体来构建表示层(view models
)的DTO。
域实体通常很重,需要data mappers或任何ORM。我更喜欢使用Domain Entities
,映射它们并避免使用其他DTO。否则也应该映射DTO。
域层应该对实体存储在某处的方式一无所知(例如在DB中)。它可以有自己的DTO,可以是重构Introduce Parameter Object的结果。
它应该知道Data Access Layer
从数据库加载数据,而Domain Layer
可以访问其业务逻辑。
它可以有自己的DTO - 视图模型,它们是域实体或DB友好DTO的用户界面友好表示。表示层负责了解view models
。
如果您只有一个演示文稿,您的Application Infrastructure也可以作为表示层的一部分实现,但通常它是一个单独的应用层。
答案 1 :(得分:2)
这实际上取决于您的具体需求。
一般来说,你应该创建2套DTO。这样可以更好地分离不同的层,并使系统的架构更加灵活。需要它的具体原因或情况例如是:
话虽如此,如果你能忍受一套DTO的限制,你可以分享它们,如果它符合你的需要,因为它产生更少的代码来编写和维护。
答案 2 :(得分:1)
您的图像显示了两个名为DTO1和DTO2的DTO对象。
DTO1在表示层和domian层之间共享数据。您可以将它们称为 ViewModel 类。
DTO2在域和数据层之间共享数据。您可以将它们称为数据传输对象( DTO )。
所以你可以使用两个不同的转移对象。
答案 3 :(得分:0)
如果我们假设您使用两个分开的DTO(DTO1和DTO2),
答案很简单:
在这种情况下,您必须创建两个单独的DTO:DTO1和DTO2。
即使它们是相同的,它们也应该作为单独的类实现。
这是因为DTO1是在域层中创建的,但DTO2是在数据层中创建的(根据你的图片)。
请注意,在某些解决方案中,未使用两个DTO - 有时只有一个DTO。