【问题标题】:Angular dart: How to inject a service in a multi level package environmentAngular dart:如何在多级包环境中注入服务
【发布时间】:2019-03-06 10:21:21
【问题描述】:

飞镖 2.0.0 角 5

我有一个应用程序分为两个包。 假设我们有包 A 和包 B,它们依赖于包 A。 在包 A 中,我有一个使用服务“ServiceA”的类。 现在,在包 B 中,我有一个名为“Service B”的服务,它扩展了“serviceA”。每次使用包 A 中的“serviceA”时,我都想注入“service B”而不是“serviceA”。 我尝试以这种方式配置我的 packageB.AppComponent 提供程序:

类提供者(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);

这里的想法是将生成服务(()=> ServiceA())的函数与ServiceAFactory解耦,这样我就可以(手动...)在包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;
  }

这样可以工作,但我真的不喜欢生成所有这些额外的代码。 还有其他解决方案吗?

【问题讨论】:

    标签: angular-dart dart-2


    【解决方案1】:

    如果想要一个类的不同实例,我建议使用工厂而不是单独的提供者。特别是如果您想始终拥有不同的实例,而不管您在注入树中的哪个位置。这样,您可以在根目录中仅指定一个提供程序,并且无论您在树中的哪个位置都可以获得单独的实例。

    【讨论】:

    • 你能推荐一个工厂的例子给我看看吗?
    猜你喜欢
    • 2019-06-15
    • 2016-10-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 2020-02-27
    • 1970-01-01
    相关资源
    最近更新 更多