我应该把我的 DTO 放在哪里?

Posted

技术标签:

【中文标题】我应该把我的 DTO 放在哪里?【英文标题】:Where i should put my DTOs in clean architecture? 【发布时间】:2019-07-11 21:19:28 【问题描述】:

需要实现干净的架构并与 DTO 概念作斗争。据我了解,我不能在表示层(asp mvc)中使用我的域对象,而应该使用 DTO 或 viewmodel。我不确定这些 DTO 应该去哪里。 我有两个项目作为我的核心层(域、应用程序)。域包含我的实体 ex:'Post' + Repository 接口 ex:'IPostRepository' 。应用程序包含逻辑 ex:'IPostManager' + 'PostManager'。 映射到实体的 DTO 和 DTO 应该发生在哪里? Asp MVC,应用程序还是域?

【问题讨论】:

域和应用程序不应该知道演示细节。 @FCin 。所以我的 DTO 和映射应该驻留在 MVC 中?? 特定于网站的映射应在该网站内完成。假设您有一个网站和一个 WPF 应用程序,它们都使用相同的域和应用程序层。如果您在应用程序中映射它们,那么您会自动限制自己为两个应用程序拥有相同的 DTO。相反,如果您将模型映射到每个演示文稿中,则应用程序的同一部分可以有不同的 DTO。 @FCin。谢谢。我得到了它。另一个关于在 Application 项目而不是 Domain 项目中使用“PostManager”的问题 - 它负责 Post 实体上的 CRUD 操作。这是一个好还是坏的设计?? 您的 DTO 到底是用来做什么的?在干净架构 (blog.cleancoder.com/uncle-bob/2012/08/13/…) 的上下文中,有许多称为“请求、请求模型、响应模型、响应”的“DTO”...... 【参考方案1】:

这看起来像一个单一的应用程序。所以在这种情况下,我将我的 DTO 放置在尽可能靠近它们使用的地方。如果是 MVC,那么我的 DTO 就在我的视图旁边:

查看次数 帐号 Index.cshtml IndexModel.cs

或者如果是 Razor Pages,那么 DTO 就是内部类。有关工作示例,请参阅我的 ContosoUniversity 示例:

MVC example

Razor Pages example

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

【讨论】:

【参考方案2】:

在您的情况下,Presentation 和 Domain 都可以访问 DTO。所以最好拥有它基础设施并从那里引用它。

【讨论】:

【参考方案3】:

正如我们已经知道的那样,Dtos 可以是没有任何行为并且仅用于传输数据的不同类型,例如 MVC 模式中的模型或可能以后缀“classNameDto”命名的类

在您的情况下,这实际上取决于您使用应用程序层的上下文。一些开发人员理解“应用程序服务”更具体到应用程序,这意味着它们与 UI 紧密相关。

如果是这种情况,那么这是一个放置 Dto 的好地方,数据在其中映射到域模型和从域模型映射出。

否则,如果映射是在 Web 层完成的,那么 Dtos 需要去那里。

简单来说,正如@Jimmy Bogard 所说的“将类放在靠近它们实际使用的地方。”

我还建议阅读更多关于干净架构的内容,看看你是否朝着正确的方向前进。

希望这会有所帮助:)

【讨论】:

我对 CA 的了解越多,我就越感到困惑。我看到有人建议将 DTO 放在基础架构中,其他人则认为它是表示层的一部分。这里 - learmoreseekmore.com/2021/05/… DTO 在域层内...

以上是关于我应该把我的 DTO 放在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何构建一个 Java 应用程序,我应该把我的类放在哪里?

我应该把我的索引页放在哪里

在 ubuntu 上全新安装 gvim。我应该把我的插件放在哪里?

我应该把我的 .jasper 文件放在哪里以及如何访问它? [复制]

我应该把我的 php 文件放在哪里让 Xampp 解析它们?

我应该把我的着色器代码放在哪里?