【问题标题】:Angular 2 Dependency injection outside from constructor for instantiationAngular 2在构造函数之外的依赖注入以进行实例化
【发布时间】:2017-02-25 15:56:42
【问题描述】:

Angular 2 中关于 DI 的每个教程都是将依赖项设置到构造函数中。但是,如果我想创建一个类的实例并且该类对其他类有一些依赖关系。

我有 A 类和 B 类。B 类应该注入 A。但是 A 每次都不一样,应该能够创建它的实例。

如果我在A的构造函数中设置DI,如何调用new A()

我尝试使用@Inject(B) 装饰将B 作为私有变量添加到A

class A {
  @Inject(B) b: B;
}

【问题讨论】:

  • 如果您使用 DI,则不要致电new A();关键是您不需要解决依赖关系并自己创建实例。
  • 但是A应该每次都不一样,所以我必须创建一个新的实例。
  • 我不知道你想说什么。
  • A 有 foo 作为成员。但是 foo 不一样。所以我想创建 A 的实例,我可以设置 foo.如果 A 由 DI 提供,则 foo 每次都相同。
  • 我在你的例子中没有看到 foo 。请提供一个具体的演示,说明您正在尝试做什么以及为什么。

标签: angular typescript dependency-injection


【解决方案1】:

Angular 依赖注入仅支持构造函数注入。

你可以注入注射器

constructor(private injector:Injector) {}

foo() {
  var x = injector.get(B);
  var a = new A(b);
}

这也可能对您的情况有所帮助,即 DI 注入了一个工厂函数,该函数在每次调用时都会返回一个新实例。 Create new instance of class that has dependencies, not understanding factory provider

您还可以设置新的注入器,也可以包括用于查找提供程序的父注入器。另见Getting dependency from Injector manually inside a directive

【讨论】:

  • 感谢您的快速响应。链接背后的两种方式看起来有点难看 - 更像是“该死的我们需要一种解决方法”。我的想法是构建一个 HTTP-Builder,我可以在其中构建我的请求 url,然后只在使用 http.get(....) 的构建器上调用 request()
  • 不知道为什么你觉得它们很丑。我发现他们都很直截了当。
  • 在上面的示例中,您还可以将B 注入构造函数而不是Injector。对injector.get(B) 的后续调用将返回相同的实例(以防不清楚)。
  • 我发现构造函数中的 DI 对于需要 DI 和 super(the_DI_item) 的子类特别糟糕,如果超类需要它们。如果你只是 DI Injector 并传递给 super ,那么它就不需要不断更新所有构造函数。谢谢。
  • 但恕我直言,它使代码更难推理。我不需要经常更新构造函数,但我使用的是 Dart,这里组件的继承没有落地 ye ;-)。
猜你喜欢
  • 2016-12-30
  • 2018-12-03
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 2011-02-02
  • 2017-01-09
相关资源
最近更新 更多