在清洁架构中,我应该把我的DTO放在哪里?

27

在这里输入图片描述

需要实现干净的架构,但愁于DTO概念。据我所知,在表示层(ASP MVC)中不能使用我的领域对象,而应该使用DTO或ViewModel。我不确定这些DTO应该放在哪里。 我有两个项目作为核心层(Domain,Application)。Domain包含实体(如:“Post”)和仓库接口(如:“IPostRepository”)。Application包含逻辑(如:“IPostManager”、“PostManager”)。 DTO和DTO映射到实体应该在哪里完成?Asp MVC、Application还是Domain?


域和应用程序不应该了解演示细节。 - FCin
@FCin . 所以我的DTO和映射应该放在MVC中吗? - Emad Ali
1
网站特定的映射应该在该网站内完成。想象一下,您拥有一个网站和一个使用相同域和应用程序层的WPF应用程序。如果您将它们映射到应用程序中,则自动限制了两个应用程序具有相同的DTO。相反,如果您在每个演示文稿中映射自己的模型,则可以为应用程序的同一部分使用不同的DTO。 - FCin
@FCin 谢谢。我明白了。关于将负责Post实体的CRUD操作的“PostManager”放在应用程序项目中而不是域项目中的另一个问题。这是好设计还是坏设计? - Emad Ali
你的DTOs到底是用来做什么的?在干净架构(https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html)的背景下,有许多名为“请求,请求模型,响应模型,响应”的“DTOs”。 - plainionist
3个回答

8
正如我们所知,Dto可以是不同类型的,它们没有任何行为,只用于传输数据,例如MVC模式中的Model或可能以后缀“classNameDto”命名的类。
在您的情况下,这实际上取决于您使用应用程序层的上下文。一些开发人员理解“应用程序服务”更加特定于应用程序,这意味着它们与UI紧密联系。
如果是这种情况,则将Dtos放置在此处是一个很好的地方,其中数据映射到和从域模型映射。
否则,如果映射在Web层完成,则需要将Dtos放在那里。
简单来说,就像@Jimmy Bogard所说:“将类放在实际使用它们的地方。”
我还建议阅读更多关于清洁架构的内容,并查看您是否朝着正确的方向前进。
希望这有所帮助 :)

我越读有关CA的内容,就越感到困惑。我看到有人建议将DTO放在基础设施内部,而其他人则认为它是演示层的一部分。在这里 - https://www.learmoreseekmore.com/2021/05/clean-architecture-in-dotnet5-application.html DTOs位于领域层内... - Dorin Baba
我认为这取决于您打算在哪里使用这些DTO。例如,如果DTO主要由依赖于某些私有API的前端使用,则我会将DTO放入UI层,因为系统的其他部分不需要了解这些DTO。但是,如果这些DTO被另一个微服务(例如公共API)使用,则我会将它们移动到SharedKernel中,以便Web前端和API服务之间共享。 - GETah

6
这看起来像是一个单一的应用程序。因此,在这种情况下,我会尽可能地将我的DTO放在它们被使用的地方附近。如果是MVC,则我的DTO就在我的视图旁边:
  • 视图
    • 账户
    • Index.cshtml
    • IndexModel.cs
或者如果是Razor Pages,则DTO只是内部类。请参阅我的ContosoUniversity示例以获得一个可行的示例:

MVC 示例

Razor Pages 示例

这不是“干净的架构”,而是“垂直切片架构”,但这并不重要。将类放在实际使用它们的地方附近。

-4
在你的情况下,DTO 被演示层和领域层都访问。因此最好将其放在基础设施中,并从那里引用它。

11
会不会让领域层依赖基础设施层? - GETah

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