【问题标题】:Aurelia: partial injection for base classAurelia:基类的部分注入
【发布时间】:2020-06-21 07:04:42
【问题描述】:

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

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】:

    一个明显的解决方案是列出+注入子类的所有依赖项。但这要求所有子类也必须维护超类的依赖关系。

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

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

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

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

    【讨论】:

    • 另一种选择是不在您的基类中使用构造函数注入或基于装饰器的注入,而只需在那里手动使用 Aurelia 的容器实例,完全避免继承问题
    • 可能,虽然有一些缺点: * Container.instance 的静态访问将提供根容器,这可能不尊重生命周期设置。注入到基类的服务也可能有依赖关系 * 通常,构造函数参数更简洁,不会将不必要的 DI 逻辑混入类 * 手动访问会增加复杂性,对于每个参数,必须添加 container.get(Foo)跨度>
    猜你喜欢
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多