【问题标题】:Angular 2 dependency injection: Inject multiple instancesAngular 2 依赖注入:注入多个实例
【发布时间】:2016-10-23 00:00:17
【问题描述】:

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

现在我想写一个2个用户同时登录的测试用例,自动测试用户1发来的消息是否直接到达用户2的收件箱。

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

我尝试了以下方法:

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

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

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

然而,事实证明,msg1 和 msg2 代表的是同一个“消息”实例:

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

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

【问题讨论】:

    标签: javascript angularjs dependency-injection angular


    【解决方案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,因为没有父级。

    【讨论】:

    • 感谢您的回答,但我收到此错误:pastebin.com/raw/56N7sfZ9 我使用此代码:pastebin.com/raw/5kh2ZHvD
    • 抱歉,输入太早:我收到此错误:pastebin.com/raw/56N7sfZ9 我使用了此代码:pastebin.com/raw/5kh2ZHvD
    • 我弄错了如何创建子注射器。我更新了我的答案。
    猜你喜欢
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多