【问题标题】:Create a new instance of a class that is using dependency injection in Aurelia在 Aurelia 中创建使用依赖注入的类的新实例
【发布时间】:2017-12-26 11:02:48
【问题描述】:

我想创建一个工厂,它能够创建一个使用依赖注入的类(MyClass,实现一个抽象类)的新实例。

我希望工厂看起来像这样:

工厂

export class Factory {

  public static makeMyClass() {
    return new MyClass();
  }

}

但是,当我采用这种方法时,EventAggregator 并未注入 MyClass。

我该怎么做?

界面

export abstract class MyClassInterface {

  abstract connect();
  abstract disconnect();
  abstract send(message: string);

}

@inject(EventAggregator)
export class MyClass {

  constructor(EventAggregator) {}

  connect() {}
  disconnect() {}
  send(message: string) {}

}

提前致谢!

【问题讨论】:

  • @inject(NewInstance.of(MyClass)) 就足够了。如果您真的想使用工厂,则必须将 EventAggregator 注入工厂,然后将其传递给 MyClass 实例 -> new MyClass(this.eventAggregator);
  • 另外,您已将构造函数参数命名为 EventAggregator,这是类名,这可能会导致问题。我建议将其更改为 eventAggregatorea 或其他内容。

标签: dependency-injection aurelia aurelia-di


【解决方案1】:

第一个选项

使用NewInstance.of 解析器:

import {inject, NewInstance} from 'aurelia-framework';

@inject(NewInstance.of(MyClass))
export class MyViewModel {
   constructor(myClass) {
     this.myClass = myClass; //myClass is always a new instance
   }
}

第二个选项

使用工厂:

import {inject, EventAggregator} from 'aurelia-framework';

@inject(EventAggregator)
export class MyFactory {

  constructor(eventAggregator) {
    this.eventAggregator = eventAggregator;
  }

  public static createMyClass() {
    return new MyClass(this.eventAggregator);
  }
}

@inject(MyFactory)
export class MyViewModel {

  constructor(myFactory) {
    this.myClass = myFactory.createMyClass();
  }
}

【讨论】:

  • 感谢法比奥!依赖注入对我来说仍然有点复杂,但我开始理解其中的原理。感谢您的快速回答!
  • @martin 在使用@inject(NewInstance.of(MyClass)) 时如何在测试中模拟MyClass
  • @Bulkan 如果您使用 aurelia-testing 库,您可以在 aurelia.container 对象上使用 registerInstance 方法。文档中有几个很好的例子aurelia.io/docs/testing/components
  • @martin 我已经尝试过了,我一直在github.com/aurelia/dependency-injection/issues/137 中遇到这个错误,我无法找到解决方案
猜你喜欢
  • 2016-10-05
  • 2017-02-23
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多