Я просмотрел документацию Aurelia DI и посмотрел исходный код и хотел поделиться тем, чего я пытаюсь достичь, чтобы меня можно было сбить, если мне не хватает чего-то очевидного. Я посмотрел образцы здесь для TS с Aurelia, но я не вижу, как он будет работать, а документы отсутствуют.
Я хочу:
dataProvider.js (интерфейс поставщика данных)
export interface DataProvider {
getData(): number;
}
itemDisplayer1.js (класс, который будет потреблять внедренный класс, реализующий интерфейс)
import {inject} from 'aurelia-framework';
import {DataProvider} from './dataProvider';
@inject(DataProvider)
export class itemDisplayer1 {
constructor(public dataProvider: DataProvider) {
this.dataProvider = dataProvider;
this.data = dataProvider.getData();
}
}
itemDisplayer2.js (другой класс, который будет использовать введенный класс, реализующий интерфейс)
import {inject} from 'aurelia-framework';
import {DataProvider} from './dataProvider';
@inject(DataProvider)
export class itemDisplayer2 {
constructor(public dataProvider: DataProvider) {
this.dataProvider = dataProvider;
this.data = dataProvider.getData();
}
}
GoodDataProvider.js
import {DataProvider} from "./dataProvider";
export class GoodDataProvider implements DataProvider {
data = 1;
getData() {
return this.data;
}
}
BetterDataProvider.js
import {DataProvider} from "./dataProvider";
export class BetterDataProvider implements DataProvider {
data = 2;
getData() {
return this.data;
}
}
И затем где-нибудь (?) я хотел бы настроить, что itemDisplayer1 должен быть предоставлен экземпляром GoodDataProvider, а itemDisplayer2 должен быть предоставлен экземпляром BetterDataProvider (1).
Затем возникает проблема контекста DI. Я не уверен, как использовать container.createChild(). Там не так много информации об этом, что я могу найти. Он создает дочерний контейнер и при необходимости передает делегату родительский элемент, но если я создам 2 дочерних контейнера и зарегистрирую один из 2 провайдеров с каждым дочерним контейнером, как бы классы itemDisplayer знали, какой из них использовать (без изменения их определений и инъекции в родительский контейнер и т.д.)?
Примечание. Информация управления жизненным циклом не распространяется на потребителей или поставщиков зависимостей (это часто делается в примерах Aurelia DI и кажется немного произведенным). Я ожидал бы, что это будет определено, когда потребители и поставщики будут связаны - point '(1)' выше.
В заключение, возможно ли это? Это что-то, что есть на картах для ближайшего будущего? Должен ли я пытаться заменить Aurelia DI на пользовательский контейнер, который отвечает моим потребностям?
(Причина, по которой я пытаюсь сделать это, заключается в том, что для оценки js-фреймворков в качестве одного из критериев необходимо, чтобы в среде фреймворков была продемонстрирована зрелая система DI с возможностями управления временем жизни /AOP и т.д.)