抱歉,如果标题含糊不清..
我有以下接口实现
ILogProvider
:
MultiLogProvider
、LogInjector
、AppInsightsLogger
和ConsoleLogger
我也有课
DeviceInfoManager
..
预期的行为是:
MultiLogProvider 接受一组
ILogProvider
,在本例中,
AppInsightsLogProvider
和 ConsoleLogger
MultiLogProvider
被注入到LogInjector
和DeviceInfoManager
(仅供参考,LogInjector
依赖于DeviceInfoManager
,因此很复杂)任何其他要求
ILogProvider
的事情都应该得到 LogInjector
我尝试了
.when
、.whenNoAncestorMatches
和其他几个 .when*
函数的几种不同变体,但我要么最终得到循环依赖,要么由于一些看似不确定的解析循环而导致请求永远不会解析。
我相当确定这两行是正确的:
this.container.bind<ILogProvider>(TYPES.ILogProvider).to(ConsoleLogger).inSingletonScope().whenInjectedInto('MultiLogProvider');
this.container.bind<ILogProvider>(TYPES.ILogProvider).to(AppInsightsLoggingProvider).inSingletonScope().whenInjectedInto('MultiLogProvider');
我不知道以下 2 使用什么
.when
函数:
this.container.bind<ILogProvider>(TYPES.ILogProvider).to(MultiLogProvider).inSingletonScope().when*????
this.container.bind<ILogProvider>(TYPES.ILogProvider).to(LogInjector).inSingletonScope().when*????
感谢任何帮助。
让我们分解每个要求:
接受一组MultiLogProvider
,在本例中为ILogProvider
和AppInsightsLogProvider
:ConsoleLogger
multiInject
:
@multiInject(TYPES.ILogProvider) loggers: ILogProvider[]`
您的绑定看起来正确:
this.container.bind<ILogProvider>(TYPES.ILogProvider).to(ConsoleLogger)
.inSingletonScope()
.whenInjectedInto('MultiLogProvider');
this.container.bind<ILogProvider>(TYPES.ILogProvider).to(AppInsightsLoggingProvider)
.inSingletonScope()
.whenInjectedInto('MultiLogProvider');
被注入到MultiLogProvider
和LogInjector
(仅供参考,DeviceInfoManager
依赖于LogInjector
,因此很复杂)DeviceInfoManager
这意味着我们有这些依赖关系(左边有右边的依赖关系):
LogInjector
--> MultiLogProvider
DeviceInfoManager
--> MultiLogProvider
您可以使用两种绑定:
this.container.bind<ILogProvider>(TYPES.ILogProvider)
.to(MultiLogProvider)
.inSingletonScope()
.whenInjectedInto('LogInjector');
this.container.bind<ILogProvider>(TYPES.ILogProvider)
.to(MultiLogProvider)
.inSingletonScope()
.whenInjectedInto('DeviceInfoManager');
或者将两者组合成一个自定义绑定:
import { typeConstraint } from "inversify";
this.container.bind<ILogProvider>(TYPES.ILogProvider)
.to(MultiLogProvider)
.inSingletonScope()
.when(request =>
typeConstraint(LogInjector)(request.parentRequest) ||
typeConstraint(DeviceInfoManager)(request.parentRequest)
);
LogInjector
--> DeviceInfoManager
this.container.bind<DeviceInfoManager>(TYPES.DeviceInfoManager)
.to(DeviceInfoManager)
.inSingletonScope()
任何其他要求
的事情都应该得到ILogProvider
LogInjector
LogInjector
应该用在任何需要 ILogProvider
的地方,除了需要 MultiLogProvider
的情况(您已在 B 中处理过)。
import { typeConstraint } from "inversify";
this.container.bind<ILogProvider>(TYPES.ILogProvider)
.to(LogInjector)
.inSingletonScope()
.when(request =>
!typeConstraint(LogInjector)(request.parentRequest) &&
!typeConstraint(DeviceInfoManager)(request.parentRequest)
);