应该在域层还是服务层定义 DTO 接口?
Should a DTO Interface be defined in Domain or Service Layer?
我希望适配器将通用接口传递给购物车服务。我读过接口应该在域层和 DTO 定义在服务层,这似乎与我冲突。您不希望域层引用定义 DTO 的服务层。
我错过了什么?或者让接口与服务层中的 DTO 一起使用是否可以,就像我在图中那样?
因此,如果您使用分层架构模式(我想您会这样做),则应考虑此模式的一个基本 属性。这 属性 意味着不同层中模块(类)之间的 "use" 依赖关系的特定顺序,特别是来自层的模块应该 "use" (依赖)模块或抽象来自下一个或多个基础层。我提到层是因为可以有一些宽松的约束,这些约束不仅允许使用最近的底层的 类,而且允许使用给定层下面的所有层。至于向上依赖,约束非常严格和明确——这是不允许的,否则它不是分层架构而是其他东西,因为它消除了分层架构应该带来的质量属性。作为一个合乎逻辑的结果——从领域层内部的服务层使用 DTO 意味着向上依赖,这违反了分层架构约束。
关于接口,分层架构的另一个基础属性是层应该通过抽象的方式相互隔离。这里的抽象可能意味着一些 public 契约(API、接口等),它们定义了更高层的意图和更低层的期望,但仅此而已,这使得分层架构从可修改性和可移植性的角度来看如此具有吸引力。这就是为什么我们谈论所有层中的接口,这只是一种抽象机制。
现在得出一个结论:如果您的 DTO 在服务层中,它们应该是同一层(或在某些情况下在上面的层)而不是下面的合同的一部分,以便排除层之间的向上依赖关系。这些接口对于域层以及用于抽象目的的任何其他层仍然有效(甚至是可取的)。
我希望适配器将通用接口传递给购物车服务。我读过接口应该在域层和 DTO 定义在服务层,这似乎与我冲突。您不希望域层引用定义 DTO 的服务层。
我错过了什么?或者让接口与服务层中的 DTO 一起使用是否可以,就像我在图中那样?
因此,如果您使用分层架构模式(我想您会这样做),则应考虑此模式的一个基本 属性。这 属性 意味着不同层中模块(类)之间的 "use" 依赖关系的特定顺序,特别是来自层的模块应该 "use" (依赖)模块或抽象来自下一个或多个基础层。我提到层是因为可以有一些宽松的约束,这些约束不仅允许使用最近的底层的 类,而且允许使用给定层下面的所有层。至于向上依赖,约束非常严格和明确——这是不允许的,否则它不是分层架构而是其他东西,因为它消除了分层架构应该带来的质量属性。作为一个合乎逻辑的结果——从领域层内部的服务层使用 DTO 意味着向上依赖,这违反了分层架构约束。
关于接口,分层架构的另一个基础属性是层应该通过抽象的方式相互隔离。这里的抽象可能意味着一些 public 契约(API、接口等),它们定义了更高层的意图和更低层的期望,但仅此而已,这使得分层架构从可修改性和可移植性的角度来看如此具有吸引力。这就是为什么我们谈论所有层中的接口,这只是一种抽象机制。
现在得出一个结论:如果您的 DTO 在服务层中,它们应该是同一层(或在某些情况下在上面的层)而不是下面的合同的一部分,以便排除层之间的向上依赖关系。这些接口对于域层以及用于抽象目的的任何其他层仍然有效(甚至是可取的)。