【发布时间】:2021-10-08 06:07:26
【问题描述】:
我开始使用洋葱架构是因为我对以前的项目结构不满意。我的主要问题是,我可以从数据访问层返回 DTO 吗?
这是我目前的结构:
/Core
- Application
- Domain
/Infrastructure
- Persistence
- Identity
/WebApi
- WebApi
快速解释:
- 应用层是我拥有所有业务逻辑的地方
- 域层是定义所有实体/模型的地方
- 持久层是我查询数据库的地方
- 身份层用于用户管理
- WebApi 层是我拥有控制器的地方
数据流如下:
Client <- WebApi Layer <- (DTO) Application Layer <- (Entity) Persistence Layer
截至目前,持久层返回在应用层转换为 DTO 的领域层中定义的实际数据库实体。
我的问题是,持久层实际上需要执行不同的查询,这会使类型与实体类型不同。例如,我可以加入不同的表、应用分组等。因此,我无法返回实体类型。
我是否可以从持久层(数据访问层)返回 DTO?如果是,我在哪里定义这些 DTO?将它们与应用层中的其他 DTO 一起定义并在持久层中使用这些 DTO 将使其依赖于应用层(在我看来不是很好,因为我们希望最小化耦合)。另一种选择是在域层中与实体一起创建它们(可能是更好的方法)?出于一致性考虑,我应该只从应用层返回 DTO,还是返回实体类型和 DTO 一样好?
我找不到很多问题。只是想成为一个更好的程序员:)
【问题讨论】:
-
这个问题可能是在征求意见。我更喜欢将包括 DTO 在内的所有模型放在一个核心/抽象库项目中,以便将它们组织在一起。但“视情况而定”可能是唯一正确的答案。
-
一般来说,这就是架构标签的问题,我认为在这个领域(在限制范围内)弯曲规则并不是一件坏事。架构是关于权衡取舍;在没有完整上下文(包含过多细节的问题)的情况下,基于有限信息诉诸意见可能是我们所拥有的最好的方法。我认为不同的意见是架构问题有价值的原因——承认它使答案分配成为问题。
-
完全同意你@AdrianK!几乎所有架构问题都需要基于意见的解决方案。我在犹豫是否发布这个问题,但我试图提供尽可能多的信息,如果我不能在 StackOverflow 上问这样的问题,我不知道还有哪里。我不认为这样的问题会降低 StackOverflow 试图保持的质量,相反,它为程序员提供了指导。
标签: c# asp.net-core architecture 3-tier onion-architecture