Tsyringe с множественным подключением зависимостей

#typescript #dependency-injection

#typescript #внедрение зависимостей

Вопрос:

Я пытаюсь реализовать каскадирование с помощью tsyringe.

У меня есть одноэлементный класс базы данных, который должен быть введен в класс обслуживания, который должен быть введен в класс контроллера:

 @injectable()
class DashboardDAO implements IDashboardDAO {...}

@injectable()
class DashboardService implements IDashboardService {
    construtor(@inject('DashboardDAO') private dashboardDao: IDashboardDAO){}
}

@injectable()
class DashboardController {
    construtor(@inject('DashboardService') private dashboardService: IDashboardService){}
}
  

в моем контейнере у меня следующая конфигурация.

 /** REPOSITORIES */
container.registerSingleton<IDashboardDAO>('DashboardDAO', DashboardDAO);

/** SERVICES */
container.registerSingleton<IDashboardService>('DashboardService', DashboardService);
  

Я хотел бы создать экземпляр контроллера со всем введенным, что-то вроде этого:

 const controller = container.resolve(DashboardController);
  

Не удалось разрешить… Я получаю следующую ошибку:

Попытка разрешить незарегистрированный токен зависимости

Если я выполню приведенный ниже код, он будет работать нормально, но я хотел бы разрешить контроллер со всеми инъекциями.

 container.resolve(DashboardService);
  

Кто-нибудь знает почему?

Tks!

Комментарии:

1. container.resolve('DashboardService') Работает ли?

2. работает, и мне не нужно регистрировать службу, а параметром DashboardService должно быть имя класса, а не строка

3. @ReculosGerbiNeto можете ли вы решить эту проблему?

4. @kbvishnu не совсем, мы сделали обходной путь, извините за задержку.

Ответ №1:

Службы, реализующие интерфейсы, зарегистрированы правильно, хотя незначительным улучшением было бы опустить тип шаблона при регистрации, поскольку он ничего не добавляет:

 container.registerSingleton('DashboardDAO', DashboardDAO);
container.registerSingleton('DashboardService', DashboardService);
  

Я бы рекомендовал использовать символ вместо жестко запрограммированной строки, но это второстепенный момент.

Проблема в том, что вы пометили DashboardController класс как вводимый, но не указали tsyringe , как разрешить класс. Один из способов — пометить его как одноэлементный:

 @singleton()
class DashboardController {...}
  

или:

 container.registerSingleton(DashboardController)
  

Тогда решение с container.resolve(DashboardController) помощью должно работать нормально.

Комментарии:

1. Я сделал почти то же самое, что и выше. У меня есть отдельные файлы интерфейса, реализации, контроллеров и маршрута. Я разрешаю зависимости / регистрирую их в другом файле с помощью одной функции и экспортирую его. This is to consolidate all DI into one place and try to invoke the call from app's constructor. Однако я получаю ту же ошибку, что и выше. Но если я вызову функцию в файле в route, тогда она сможет разрешиться. Предположим, что мой маршрут есть /seller , и у меня есть /sellerloc также в отдельном файле, нужно ли мне вызывать то же самое для разрешения проблем?

2. Я предлагаю опубликовать новый вопрос и включить достаточно кода, чтобы объяснить ситуацию, или ссылку на скрипку. Мне также нравится помещать все начальные настройки в один файл, и это работает хорошо, поэтому я могу быть в состоянии помочь.

3. Это было решено thnks