внедрение зависимости от машинописного текста с небольшим отпечатком - PullRequest
0 голосов
/ 01 апреля 2019

Я новичок в nodejs и машинописи, пришедших из C #. Я хочу использовать внедрение зависимостей в своем проекте и обнаружил, что наиболее популярным пакетом является inversify.

Я начал использовать его, но мне не нравится тот факт, что я должен добавлять декораторы повсюду.

например, меня беспокоит необходимость добавления @inject перед параметрами в конструкторе:

public constructor(
    @inject(TYPES.Weapon) katana: Weapon,
    @inject(TYPES.ThrowableWeapon) shuriken: ThrowableWeapon
)

Это означает, что каждый класс должен знать объект TYPES ...

Я не понимаю, почему @inject нуждается в строковом литерале и не может вводить только на основе типа ...

Есть ли более аккуратный способ сделать это?

1 Ответ

1 голос
/ 01 апреля 2019

В отличие от строго типизированных языков, типы TypeScript не существуют во время выполнения.Можно использовать информацию о типе во время выполнения для внедрения зависимости, но ограниченным образом.С помощью опции emitDecoratorMetadata TypeScript можно получить типы параметров конструктора и использовать их для DI.

Пример: injection-js, то есть угловой инжектор, извлеченный избиблиотека для автономного использования.Для класса с поддержкой DI необходимо использовать только декоратор @Injectable, декораторы параметров @Inject являются необязательными.

Ограничения заключаются в том, что таким образом могут вводиться только экземпляры класса:

constructor(foo: FooClass) {}

Обобщения игнорируются и отбрасываются:

constructor(foo: FooClass<Bar>) {}

Другие типы игнорируются и приводят к ошибке DI:

constructor(foo: fooSymbol) {}

constructor(foo: 'foo string provider') {}

То же применяется к InversifyJS :

В случае конкретных инъекций вы можете просто определить параметры конструктора как обычно, не используя @inject decorator.

InversifyJS также поддерживает назначения конструкторов TypeScript, поэтому вы можете иметь частные или защищенные модификаторы доступав ваших параметрах и контейнере не составит труда ввести зависимости

Можно было бы опустить @inject для Weapon и ThrowableWeapon, если бы они были классами, но в перечисленном примере TYPES.Weapon является символом, а Weapon является интерфейсом, который не существует во время выполнения , поэтому @inject необходим.

...