使用依赖注入实例化Class常量

时间:2017-06-09 20:29:23

标签: javascript angularjs ecmascript-6 constants es6-class

我们使用角度常量来定义类。我怎么能这样做,以便一个类常量在实例化时可以在构造函数中有一个参数,但也有依赖注入?我正在考虑这样的思路:

ClassA.js

class ClassA { ... }

angular.module("myApp").constant("ClassA", ClassA);

ClassB.js

class ClassB {
  constructor(constrParams, ClassA) { // mix of constructor parameter and DI
    this.constrParams = constrParams;
    this.ClassA = ClassA;
  }
}

ClassB.$inject = ["ClassA"]; // ClassB needs reference to ClassA
angular.module("myApp").constant("ClassB", ClassB);

在另一个常量

中导入ClassB时,我是否仍然能够这样做

ClassC.js

class ClassC {
  constructor(ClassB) {
    this.classBinst = new ClassB("myparams"); // instantiate new ClassB instance
  }
}

ClassC.$inject = ["ClassB"];
angular.module("myApp").constant("ClassC", ClassC);

2 个答案:

答案 0 :(得分:1)

如果你想手动传递任何构造函数参数,我认为你必须手动传递它们。

所以ClassC也必须将ClassA作为参数,并将其传递给ClassB

class ClassC {
  constructor(ClassB, ClassA) {
    this.classBinst = new ClassB("myparams", ClassA); // instantiate new ClassB instance
  }
}

但是如果您创建需要ClassD的{​​{1}},那么您就会遇到同样的问题 - 需要传递ClassC及其所有依赖项({{ 1}}和ClassC)。

但如果ClassB是最终级别并且可以实例化并作为单例注入,那么您可以创建一个实例化ClassA的服务,而不必担心其依赖性:

ClassC

也许您最好创建一个为您创建这些类的实例的服务。该服务可以解决类所需的依赖关系并手动传递它们,而控制器可以传入任何自定义参数:

ClassC

答案 1 :(得分:0)

我扩展了Frank关于提供类作为服务的想法,但是使用了工厂结构。工厂提供可以直接实例化的类定义,而不是服务中的显式创建函数。模式如下:

ClassA.js

class ClassA { ... }

angular.module("myApp").factory("ClassA", () => ClassA);

ClassB.js

class ClassB {
  constructor(constrParams) {
    this.constrParams = constrParams;
    // this.ClassA reference is already injected through factory
  }
}

angular.module("myApp")
.factory("ClassB", ["ClassA", (ClassA) => {
  // this is where dependency injection happens
  ClassB.prototype.ClassA = ClassA;
  return ClassB; // class definition
}]);

ClassC.js(最终目标 - 与之前相同)

class ClassC {
  constructor() {
    // instantiate new ClassB instance
    this.classBinst = new this.ClassB("myparams");
  }
}

angular.module("myApp").factory("ClassC", ["ClassB", (ClassB) => {
  ClassC.prototype.ClassB = ClassB;
  return ClassC;
}]);

相关模式:Correct way of wrapping javascript class in AngularJS module and inject angular services