用例接口(应用程序服务)?

问题描述 投票:0回答:4

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

如果答案是肯定的,那么用例的接口应该在哪里,在领域层还是在应用层?显然,实现应该始终在应用程序层。

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

提前致谢。

domain-driven-design use-case hexagonal-architecture
4个回答
8
投票

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

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

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


5
投票

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

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

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

但是,如果出现以下情况,您可能仍然需要用例上的接口:

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

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

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

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


2
投票

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


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.