Angular 2依赖注入:注入多个实例

时间:2016-06-21 12:25:24

标签: javascript angularjs dependency-injection angular

我有一个“Messages”注入表示可以获取用户消息的服务。此类依赖于使用用户凭据登录后端的“数据库”类。

现在我想编写一个测试用例,在此期间有2个用户同时登录,以便自动测试用户1发送的消息是否直接到达用户2的收件箱。

因此,我需要一种方法,用两个不同的,相应的“数据库”实例注入两个不同的“消息”实例。

我尝试了以下内容:

  beforeEachProviders(() => [
    Messages, Database
  ]);

  beforeEach(inject([Messages], (msg) => {
    this.msg1 = msg;
  }));

  beforeEach(inject([Messages], (msg) => {
    this.msg2 = msg;
  }));

然而,事实证明,msg1和msg2代表“Messages”的相同实例:

it('testcase', () => {
  // this.msg1 == this.msg2;
});

是否可以告诉注入器创建“消息”及其依赖项的不同实例?

1 个答案:

答案 0 :(得分:1)

这是Angular DI的工作原理。对于单个提供者,您始终可以获得相同的实例。

作为一种解决方法,您可以注入Injector并使用

var child = ReflectiveInjector.fromResolvedProviders(
  ResolvedReflectiveProvider([Message, Database]), injector);
var msg2 = child.get(Message);

通过这种方式,您应该获得MessageDatabase的不同实例,而其他提供程序可以从父注入器重用(例如MockBackend,...)`

您也可以使用

var injector = ReflectiveInjector.resolveAndCreate([Message, Database]);
var msg2 = child.get(Message);

但是这样您需要提供所有依赖项,而不仅仅是MessageDatabase,因为没有父项。