Внедрение зависимостей 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) {}
}

Обратите внимание на Сервис. Сервис предоставляется в родительском модуле, поэтому он иерархический.

Другие вопросы по тегам