Аурелия: частичная инъекция для базового класса - PullRequest
1 голос
/ 09 марта 2020

Я не нашел хорошего примера решения этой проблемы, когда в наследовании некоторые параметры конструктора должны быть определены и переданы подклассом (классами), а остальные должны быть введены.

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

}

1 Ответ

1 голос
/ 09 марта 2020

Одним из очевидных решений было бы перечисление + внедрение всех зависимостей подкласса. Но для этого необходимо, чтобы все подклассы также поддерживали зависимости суперкласса.

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 поддерживает наследование при определении инъекций (будь то в виде массива stati c или декоратора класса) , так что зависимости базового класса также «наследуются», поэтому их не нужно указывать явно, и их можно передавать с помощью оператора распространения. Таким образом, подкласс получает все введенные зависимости.

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

}

Еще одна альтернатива - использование Factory, но это не может быть применено к наследованию и будет означать необходимость рефакторинга базового класса в сервис. Поэтому при использовании наследования я обнаружил, что приведенное выше решение проще.

Примечание: вопрос и формулировка в значительной степени приводят к ответу, извините за это.

...