Одним из очевидных решений было бы перечисление + внедрение всех зависимостей подкласса. Но для этого необходимо, чтобы все подклассы также поддерживали зависимости суперкласса.
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, но это не может быть применено к наследованию и будет означать необходимость рефакторинга базового класса в сервис. Поэтому при использовании наследования я обнаружил, что приведенное выше решение проще.
Примечание: вопрос и формулировка в значительной степени приводят к ответу, извините за это.