Dart 2.0.0 角度5
我有一个分为两个软件包的应用程序。 假设我们有A包和B包,这取决于A包。 在包A中,我有一个使用服务“ ServiceA”的类。 现在,在包B中,我有一个名为“服务B”的服务,该服务扩展了“服务A”。我想每次在包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;
}
以这种方式工作,但是我真的不喜欢生成所有这些额外的代码。 还有其他解决方案吗?
答案 0 :(得分:0)
对于想要一个类的不同实例的情况,我建议使用工厂而不是单独的提供程序。特别是如果您想始终拥有一个不同的实例,而不管您在注入树中的位置如何。这样,无论您在树中的哪个位置,您都只能在根目录处指定一个提供程序,并且仍然可以获得单独的实例。