6

在遵循具有 ddd 原则的六边形架构时,用例或应用程序服务是否应该具有接口和实现?例如,用例“删除视频”,是否应该让 IDeteVideo(接口)和 DeletVideoImpl(实现)实现该接口?

如果答案是肯定的,用例的接口应该在哪里,在领域层还是在应用层?很明显,实现应该总是在应用层。

我认为用例不是经常变化的东西,所以在我看来,我认为没有必要有一个接口,有实现就足够了。但就六边形架构和 DDD 原则而言,是否对此进行了说明?

提前致谢。

4

4 回答 4

8

我认为不需要为您的应用程序服务提供接口。由于它们通常编排特定的应用程序用例,因此不应有相同类型的工作流的不同实现。此外,它们不应该依赖于基础设施本身,而是通过调用存储库、域服务或聚合上的操作来编排需要发生的操作的工作流。

更重要的是确保您的应用程序服务仅访问接口而不是依赖于基础设施的具体实现。这意味着应用程序服务应该只依赖于接口来使用存储库或访问其他基础设施的组件(例如,向外部系统发出请求的服务组件)。

但是,如果您的应用程序服务(或用例)有接口,则应在应用程序层中定义这些接口。这与应该驻留在域层中的域接口(例如存储库接口)的规则相同。

于 2020-07-12T19:47:33.130 回答
5

在遵循具有 ddd 原则的六边形架构时,用例或应用程序服务是否应该具有接口和实现?

简而言之,您通常不需要用例上的接口(在 Clean Architecture 中也称为交互器),因为您的主要适配器(您的 hexagone 的客户端)本质上依赖于 hexagone。

请注意,在制作辅助适配器(您的用例使用的外部组件)时,您仍然需要它,因为您的 hexagone 不得依赖任何辅助适配器。

但是,如果:

  • 您希望能够对您的主要适配器(尽管被认为是不起眼的对象)进行单元测试,您可以在其中通过其接口存根/模拟您的用例。

  • 您可能想为用例尝试几种替代方案以进行实验,在这种情况下,它将充当有意义的抽象。

如果答案是肯定的,用例的接口应该在哪里?在领域层还是在应用层?

它应该放在应用层级别的六边形内部,因为每个接口都定义了一个应用服务。

于 2020-07-10T13:44:56.390 回答
1

使用 hex arch 实现 DDD 时,应用程序服务的接口是驱动程序端口(用例边界,六边形的左边缘)。

六边形的内部分为两部分:应用程序服务实现和域。

于 2020-07-10T02:12:35.307 回答
1

我也在想同样的事情。由于每个应用程序服务只有一个用例,因此您不需要接口。这来自我与不同团队的实践,在这些团队中,我们没有仅用于一种实现的接口。另外,我同意应用程序服务接口(如果有的话)应该在应用程序层中定义。但我也在基础设施层看到了它们。

于 2020-07-13T19:44:56.910 回答