【问题标题】:Should a DTO Interface be defined in Domain or Service Layer? [closed]DTO 接口应该在域或服务层中定义吗? [关闭]
【发布时间】:2019-07-03 05:58:01
【问题描述】:

我希望 adpaters 将一个通用接口传递给购物车服务。我读过接口应该在域层中,而 DTO 应该在服务层中定义,这似乎与我相冲突。您不希望域层引用定义 DTO 的服务层。

我错过了什么?还是可以让接口与服务层中的 DTO 一起使用,就像我在图中那样?

【问题讨论】:

  • 如果 DTO 用于多层,通常是这样。然后引入一个包含所有 DTO 类型的项目,并让所有其他项目/层都引用它。
  • 接口无处不在,问题只是它们的用途。如果一个接口有一个 DTO 作为其契约的一部分,它应该与 DTO 在同一层中声明,但域层仍然可以有自己的接口来抽象实现、单元测试等。
  • 谢谢@DmytroMukalov。如果你想这样回答,我会接受的。

标签: c# interface service-layer


【解决方案1】:

因此,如果您使用分层架构模式(我想您会这样做),则应考虑该模式的一个基本属性。此属性意味着不同层中的模块(类)之间“使用”依赖关系的特定顺序,特别是来自一个层的模块应该“使用”(依赖于)来自下一个或多个底层的模块或抽象。我提到层是因为可以有一些宽松的约束,这些约束不仅允许使用来自最近的底层的类,而且允许使用低于给定层的所有层。至于向上的依赖关系,约束是非常严格和明确的——这是不允许的,否则它不是分层架构而是别的东西,因为它消除了分层架构应该带来的质量属性。作为一个合乎逻辑的结果 - 从领域层内部的服务层使用 DTO 意味着违反分层架构约束的向上依赖。

对于接口,分层架构的另一个基本属性是层应该通过抽象的方式相互隔离。这里的抽象可能意味着一些公共合约(API、接口等),它们定义了更高层的意图和更低的层期望,但仅此而已,这使得分层架构从可修改性和可移植性的角度如此具有吸引力。这就是为什么我们在讨论所有层中的接口,这只是一种抽象机制。

现在作为一个结论:如果您的 DTO 在服务层中,它们应该是同一层(或在某些情况下为上层)而不是下层合约的一部分,以排除层之间的向上依赖关系。对于域层以及任何其他抽象层,接口仍然有效(甚至是可取的)。

【讨论】:

    猜你喜欢
    • 2019-05-26
    • 2012-05-27
    • 2014-10-22
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    相关资源
    最近更新 更多