Внедрение зависимостей Inversify, как Angular, с использованием TS-декораторов
Сегодня я переключил проект js electronic на машинопись, спрашивая себя, есть ли эквивалентность инъекции зависимостей в angular. Поскольку Angular Universal, кажется, находится в очень раннем состоянии, и нет никакой документации по использованию его с электроном вместо экспресса, кажется, что inversify может соответствовать моим потребностям. Кроме того, потому что он более легкий, чем угловой, так как мне нужен только DI.
Я пытался создать декоратор, который должен работать аналогично NgModule
Декоратор в Angular.
import { app, Menu, ipcMain, BrowserWindow } from 'electron';
import { Container } from 'inversify';
import { DatabaseService } from 'core/database.service';
function servermodule(data: {providers: Array<any>}) {
// Some code that instantiate the declarations array classes
// Do they have to be returned, if I don't need a reference?
let container = new Container();
return (target: Object) => {
for(const service of data.providers) {
container.bind(service).toSelf();
}
}
}
который циклически просматривает каждую запись в поставщиках и связывает ее с контейнерным объектом inversifys. Эту функцию я хочу использовать следующим образом. Тогда использование будет точно таким же, как в декораторе angulars.
@servermodule({
declarations: [
// Some other classes, that maybe can get DatabaseService injected
],
providers: [
DatabaseService
]
})
export class AppModule { ...
DatabaseService
может, например, выглядеть
import { injectable } from 'inversify';
@injectable()
export class DatabaseService { ...
И должен быть введен в угловом стиле, например, как
import { inject } from 'inversify';
import { DatabaseService } from './database.service';
export class Models {
constructor(@inject(DatabaseService) dbService: DatabaseService) { }
}
Я не уверен насчет контейнера Inversify. Его область действия только в функции декоратора? Было бы лучше использовать его как
container = new Container({ autoBindInjectable: true });
Как правильно вернуть его AppModule
? Является ли моя идея объявить классы в servermodule decorator хорошей идеей?
Пока я просто получаю следующее сообщение об ошибке при выполнении tsc и электронов, но ошибок t t linting нет.
App threw an error during load
Error: Cannot find module 'database.service'
Другая идея / вопрос: если я хочу в дополнение к объявлениям и поставщикам атрибут импорта. Тогда было бы хорошей идеей изменить конструктор декоратором и импортировать эти классы?
Спасибо!
1 ответ
Что касается этого вопроса, то полгода назад я работал над реализацией функций декоратора для иерархического DI, которые выглядят как угловые, и связал их в пакет npm fl-node-di. С его помощью вы можете создавать модули
FlModule({
imports: [ AnotherModule ] // imports other FlModules
providers: [ MyService ] // adds Injectables() to the modules container
declaration: [] // same as providers but immediatly creates an instance
exports: [] // places the Injectable() in the parents container
})
export class MyModule {}
Другой модуль может выглядеть как
FlModule({
declarations: [ MyComponent ]
})
export class AnotherModule {}
И компонент может выглядеть так
@Component()
export class MyComponent {
constructor (@Inject(MyService) myService: MyService) {}
}
Обратите внимание на Сервис. Сервис предоставляется в родительском модуле, поэтому он иерархический.