Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection 清洁体系结构-将应用程序服务注入另一个应用程序服务_Dependency Injection_Domain Driven Design_Clean Architecture_Decoupling_Coupling - Fatal编程技术网

Dependency injection 清洁体系结构-将应用程序服务注入另一个应用程序服务

Dependency injection 清洁体系结构-将应用程序服务注入另一个应用程序服务,dependency-injection,domain-driven-design,clean-architecture,decoupling,coupling,Dependency Injection,Domain Driven Design,Clean Architecture,Decoupling,Coupling,我在一个PHPAPI中工作,试图遵循干净的架构模式,以便将来能够将应用程序的模块提取到微服务中 我的问题是应用程序服务应该如何在不耦合的情况下相互使用。 即使我正在注入绑定抽象(接口),注入服务的方法也在处理主机服务域之外的实体。因此,在未来,我将拥有耦合服务,而我将无法将它们外部化 即使您使用的是PHP,以下内容在概念层面上也可能很有用: 可能最简单的方法是在应用程序层中实现您所依赖的一些通用中介(集成问题) 我有一个简单的开源软件,另一个选择是Jimmy Bogard的 在我的实现中,特定的

我在一个PHPAPI中工作,试图遵循干净的架构模式,以便将来能够将应用程序的模块提取到微服务中

我的问题是应用程序服务应该如何在不耦合的情况下相互使用。 即使我正在注入绑定抽象(接口),注入服务的方法也在处理主机服务域之外的实体。因此,在未来,我将拥有耦合服务,而我将无法将它们外部化

即使您使用的是PHP,以下内容在概念层面上也可能很有用:

可能最简单的方法是在应用程序层中实现您所依赖的一些通用中介(集成问题)

我有一个简单的开源软件,另一个选择是Jimmy Bogard的

在我的实现中,特定的参与者将依赖于相关的服务,并根据传递的相关消息采取行动。任何给定的参与者都可以响应各种消息。在您的情况下,可能有两名参与者,每个参与者都依赖相关服务

当试图减少注入类或由类使用的依赖项的数量时,这种机制也能很好地工作

在过去,我还使用了一个表示用例的应用程序
Task
(不要与.Net
Task
混淆),然后它将同时接受
OrderService
PaymentService
(这里使用您的示例),并以相关方式与两者交互。一个对另一个的代码依赖性可以被提取到有意义的方法中


中介是这个概念的一个更隐式的实现,而一些特定于用例的类会更显式。

如果我能正确理解您的问题,有两个服务,例如,
OrderService
以及
PaymentService
<代码>订单服务
需要
付款服务

有两种情况

第一个场景:
PaymentService
是可独立开发的
OrderService
的第三方。如果这是真的,那么最好将
PaymentService
放在基础架构层中,并将其注入应用层服务,如
OrderService

第二种情况:
PaymentService
不是第三方。 就干净的代码而言,在这种情况下存在一个问题。违反单一责任原则。改变方法的原因不止一个,比如
someMethod
。从另一个服务中的另一个服务调用一个方法会导致多个更改原因。最好在表示层调用
PaymentService
,获取
OrderService
所需的数据,然后
OrderService
中的
someMethod
可以通过传递数据来调用,而无需注入
PaymentService


讨论这类问题有点难。希望能恰当地表达我的意思

如果服务X使用服务Y,您将始终具有耦合,但是:

干净的体系结构及其依赖倒置原则为您提供了使耦合或依赖单向化所需的工具

在您的情况下,DI和接口允许
主机
模块依赖于
注入的
模块,但决不能反过来。如果将
InjectedServiceInterface
InjectedServiceDomainEntity
的接口移动到主机模块中,甚至可以使主机模块不依赖任何东西。如果您现在调用
get
,您将只处理来自主机模块的源代码

使用DI,这些接口在不同的模块中实现。使用微服务,这些接口由远程调用基础设施组件实现

试图将耦合降低到零是没有意义的,因为这样模块就根本不进行交互。至少在源代码中是这样的


还有一个想法:在像PHP这样的动态类型语言中,如果您希望使用函数类型而不是声明的接口作为参数,并为实体/对象使用duck类型,您当然有机会进行更多的解耦。

您确定这两个服务是应用程序服务吗?I您提供的注入服务的代码可以是域服务,或者如果您只需要获取entity@MohamedBouallegue是,
OrderService
PaymentService
分别是。一个需要另一个。问题更像是这是DTO的地方,还是这些DTO只是在层之间传递数据