Aurelia:基础部分注入 class
Aurelia: partial injection for base class
我没有找到一个很好的例子来处理这个问题,在继承时,应该定义一些构造函数参数并由子类传递,其余的应该注入。
export class Superclass {
static inject = [Service1, Service2];
constructor(
//parameter(s) intented to be passed by subclasses
parameterFromSubclass,
//services intented to be injected
service1, service2) {
this.service1 = service1;
this.service2 = service2;
//do stuff based on parameterFromSubclass
}
}
为了使其更复杂,子类可能还需要注入自己的服务。
export class Subclass extends Superclass {
static inject = [Service3];
constructor(service3) {
const param = 'parameter from subclass'; //could be anything
super(param, ...?);
this.service3 = service3;
}
}
一个明显的解决方案是列出+注入子class 上的所有依赖项。但这将要求所有 subclasses 也必须维护 superclass.
的依赖关系
export class Subclass extends Superclass {
static inject = [Service1, Service2, Service3];
constructor(service1, service2, service3) {
const param = 'parameter from subclass';
super(param, service1, service2);
this.service3 = service3;
}
}
幸运的是,Aurelia DI 在定义注入时支持继承(作为静态数组或 class 装饰器),因此基础 class 依赖项也是 "inherited",所以也是不需要明确指定,可以使用扩展运算符传递。这样,subclass 得到了所有注入的依赖项。
export class Subclass extends Superclass {
static inject = [Service1];
constructor(service1, ...rest) {
const param = 'parameter from subclass';
super(param, ...rest);
this.service3 = service3;
}
}
另一种选择是使用 Factory,但这不能应用于继承,并且意味着必须将基础 class 重构为服务。所以在使用继承时,我发现上面的解决方案更简单。
备注:问题和措辞几乎都是答案,对此感到抱歉。
我没有找到一个很好的例子来处理这个问题,在继承时,应该定义一些构造函数参数并由子类传递,其余的应该注入。
export class Superclass {
static inject = [Service1, Service2];
constructor(
//parameter(s) intented to be passed by subclasses
parameterFromSubclass,
//services intented to be injected
service1, service2) {
this.service1 = service1;
this.service2 = service2;
//do stuff based on parameterFromSubclass
}
}
为了使其更复杂,子类可能还需要注入自己的服务。
export class Subclass extends Superclass {
static inject = [Service3];
constructor(service3) {
const param = 'parameter from subclass'; //could be anything
super(param, ...?);
this.service3 = service3;
}
}
一个明显的解决方案是列出+注入子class 上的所有依赖项。但这将要求所有 subclasses 也必须维护 superclass.
的依赖关系export class Subclass extends Superclass {
static inject = [Service1, Service2, Service3];
constructor(service1, service2, service3) {
const param = 'parameter from subclass';
super(param, service1, service2);
this.service3 = service3;
}
}
幸运的是,Aurelia DI 在定义注入时支持继承(作为静态数组或 class 装饰器),因此基础 class 依赖项也是 "inherited",所以也是不需要明确指定,可以使用扩展运算符传递。这样,subclass 得到了所有注入的依赖项。
export class Subclass extends Superclass {
static inject = [Service1];
constructor(service1, ...rest) {
const param = 'parameter from subclass';
super(param, ...rest);
this.service3 = service3;
}
}
另一种选择是使用 Factory,但这不能应用于继承,并且意味着必须将基础 class 重构为服务。所以在使用继承时,我发现上面的解决方案更简单。
备注:问题和措辞几乎都是答案,对此感到抱歉。