Aurelia:基类的部分注入

问题描述 投票:1回答:1

我没有找到一个很好的例子来处理这个问题,在继承时,应该由子类定义并传递一些构造函数参数,而其余的应该被注入。

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;
    }

}
javascript inheritance ecmascript-6 dependency-injection aurelia
1个回答
1
投票

一个明显的解决方案是列出并注入子类上的所有依赖项。但这将要求所有子类还必须维护超类的依赖项。

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在定义注入时支持继承(作为静态数组或类装饰器),因此基类的依赖关系也被“继承”,因此不需要显式指定并且可以使用传播运算符进行传递。这样,子类将注入所有依赖项。

export class Subclass extends Superclass {
    static inject = [Service1];
    constructor(service1, ...rest) {
        const param = 'parameter from subclass';
        super(param, ...rest);
        this.service3 = service3;
    }

}

另一种选择是使用Factory,但是不能应用于继承,这意味着必须将基类重构为服务。因此,在使用继承时,我发现上面的解决方案更简单。

备注:这个问题和措辞几乎导致了答案,对此感到抱歉。

© www.soinside.com 2019 - 2024. All rights reserved.