TypeScript InversifyJS: сложные привязки для нескольких реализаций интерфейса

#typescript #dependency-injection #inversion-of-control #inversifyjs

#typescript #внедрение зависимостей #инверсия управления #inversifyjs

Вопрос:

Извините, если название расплывчатое..

У меня есть следующие реализации интерфейса ILogProvider : MultiLogProvider , LogInjector , AppInsightsLogger , и ConsoleLogger

У меня также есть класс DeviceInfoManager ..

Ожидаемое поведение:

  1. MultiLogProvider принимает в массив ILogProvider , в данном случае, AppInsightsLogProvider и ConsoleLogger

  2. MultiLogProvider вводится в LogInjector и DeviceInfoManager (к вашему сведению, LogInjector имеет зависимость от DeviceInfoManager , отсюда и сложность)

  3. Все, что еще запрашивает ILogProvider , должно получить LogInjector

Я пробовал несколько разных вариантов .when , .whenNoAncestorMatches , и пару других .when* функций, но в итоге либо получаю циклическую зависимость, либо запрос просто никогда не разрешается из-за какого-то, казалось бы, неопределенного цикла разрешения.

Я совершенно уверен, что эти 2 строки верны:

 this.container.bind<ILogProvider>(TYPES.ILogProvider).to(ConsoleLogger).inSingletonScope().whenInjectedInto('MultiLogProvider');

this.container.bind<ILogProvider>(TYPES.ILogProvider).to(AppInsightsLoggingProvider).inSingletonScope().whenInjectedInto('MultiLogProvider');
  

Чего я не могу понять, так это то, какую .when функцию использовать для приведенных ниже 2:

 this.container.bind<ILogProvider>(TYPES.ILogProvider).to(MultiLogProvider).inSingletonScope().when*????

this.container.bind<ILogProvider>(TYPES.ILogProvider).to(LogInjector).inSingletonScope().when*????
  

Ценю любую помощь.