gpt4 book ai didi

c# - 我们应该如何在 Clean Architecture 中的层之间传递数据?

转载 作者:行者123 更新时间:2023-12-04 13:35:29 24 4
gpt4 key购买 nike

我一直在阅读 Robert Martin 的“Clean Architecture”并且一直在努力理解一件事:我们应该如何在 中的层之间传递数据“清洁建筑” ?

根据罗伯特·马丁的说法:

The important thing is that isolated, simple data structures are passed across the boundaries. We don’t want to cheat and pass Entity objects or database rows. We don’t want the data structures to have any kind of dependency that violates the Dependency Rule.



如果我理解正确,我们应该始终在层之间传递 DTO。例如,业务逻辑层不应该将域实体返回给 UI 层,它应该将域实体映射到 DTO 并返回它。

同理,业务逻辑层将域实体映射到DTO,传递给数据访问层,因此数据访问层对域实体一无所知。

这有点可怕,因为我们必须为一个请求执行 8 个映射(4 个输入 -> 和 4 个输出 <-)请看下图。

请注意,图中的箭头显示的是数据流,而不是依赖关系。

enter image description here

我试图找到好的例子,但它们只会让我感到困惑。例如,某些示例具有由数据访问层直接使用的域实体,因此域实体决定了数据库中表的结构(域实体用作 Entity Framework 实体)。

但是如果有一天我决定改变表结构呢?这意味着我不仅必须在数据访问层中进行更改,还必须在业务逻辑层中进行更改。 它打败了“插件架构” .

什么是正确的方法?

最佳答案

也许它与 Uncle Bob 的干净架构并不完全一致,但这就是我在基于干净架构的项目中跨边界传递数据的方式:

  • 从 View 到 Controller 的请求对象 (DTO)
  • 从 Controller 向用例交互器请求模型 (DTO)
  • 域实体到/从存储库
  • 从用例交互者到演示者的响应模型 (DTO)
  • 从演示者到 View 的响应/ View 模型 (DTO)

  • 在某些情况下,我作弊,我的响应模型包含域实体。只要我没有看到严重的问题,我就会保持这种务实的妥协。
    这种设置在几个项目中对我来说效果很好。映射的数量利大于弊。
    域模型仍然独立于持久层作为从域实体到例如的映射。可以随时在存储库实现中轻松更改表行。

    关于c# - 我们应该如何在 Clean Architecture 中的层之间传递数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62365180/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com