飞镖 2.0.0 角 5
我有一个应用程序分为两个包。假设我们有包 A 和包 B,它们依赖于包 A。在包 AI 中有一个使用服务“ServiceA”的类。现在,在包 BI 中有一个名为“Service B”的服务,它扩展了“serviceA”。每次使用包 A 中的“serviceA”时,我都想注入“service B”而不是“serviceA”。我尝试以这种方式配置我的 packageB.AppComponent 提供程序:
ClassProvider(ServiceB), ClassProvider(package_a.ServiceA, useClass: ServiceB)
而且,以某种方式,它有效。上面的语句说:当你遇到一个ServiceB声明时使用一个(ServiceB的)实例,或者当你必须注入一个ServiceA类时使用另一个ServiceB实例。但我需要一些不同的东西。在 classA 中,我将 serviceA 定义为提供者,因为我希望每次调用 classA 时,都会创建一个不同的 ServiceA 实例(以及从包 B 调用 ServiceB 时)。如果我单独使用 packageA,它可以正常工作,当我运行 packageB 并调用 classA 时,我无法获得 ServiceB 的实例,但始终是 serviceA 的实例。我该如何解决这个问题?我理解 DI 的方式有问题吗?
编辑1:
Ted 的建议对我来说不是很清楚,所以我做了几个测试然后我成功了,但我不太喜欢我找到的解决方案。首先,我在 ServiceA 类中添加了这一行:
Function serviceAFactoryFunction = () => ServiceA();
ServiceA ServiceAFactory() => serviceAFactoryFunction();
const ServiceAProvider = FactoryProvider(ServiceA, ServiceAFactory);
这里的想法是从 ServiceAFactory 中解耦生成服务 (() => ServiceA()) 的函数,以便我可以(手动...)在包 B 中注入正确的函数。
在classA里面我删除了
providers: [
ClassProvider(ServiceA)
我设置了 ServiceAProvider
providers: [
ServiceAProvider
在 ServiceB 中,我添加了以下内容:
Function serviceBFactoryFunction = () => ServiceB();
ServiceB ServiceBFactory() => serviceBFactoryFunction();
const ServiceBProvider = FactoryProvider(ServiceB, ServiceBFactory);
这里只需要第一行,但我添加了另一行,以防明天我可以从该服务继承包 C。
最后一步,在包 B 的 AppComponent 类中,我删除了我定义的提供程序:
ClassProvider(ServiceB), ClassProvider(package_a.ServiceA, useClass:
ServiceB)
我更改了注入正确函数的构造函数:
AppComponent() {
package_a.serviceAFactoryFunction =
serviceBFactoryFunction;
}
这样它就可以工作,但我真的不喜欢生成所有这些额外的代码。还有其他解决方案吗?