我遇到了一个Ninject问题,我似乎无法深入了解。也许你能看到一些明显的我缺少的东西。我收到一个绑定错误,它希望我为Bool:绑定
Ninject。ActivationException:激活布尔时出错没有匹配的绑定可用,并且该类型不可自绑定。激活路径:5) 在SimulatorStateMachine类型构造函数的参数realTime中注入依赖布尔4) 将依赖项ISimulatorStateTriggers注入InputParser类型构造函数的参数stateMachine3) 将依赖InputParser注入SimulatorCommunicationsChannel类型构造函数的参数解析器2) 将依赖ICommunicationChannel注入SimulatorContext类型的属性Channel1) SimulatorContext请求建议:1) 请确保已为bool定义了绑定。2) 如果绑定是在模块中定义的,请确保该模块已加载到内核中。3) 请确保您没有意外创建多个内核。4) 如果使用构造函数参数,请确保参数名称与构造函数参数名称匹配。5) 如果使用的是自动模块加载,请确保搜索路径和筛选器正确无误。在Ninject。KernelBase。解析(IRequest请求,布尔句柄MissingBindings)在Ninject。KernelBase。解决(IRequest请求)在Ninject。规划。目标。目标`1.ResolveWithin(IContext父级)在Ninject。激活。提供商。StandardProvider。GetValue(IContext上下文,ITarget目标)在Ninject。激活。提供商。StandardProvider.c_DisplayClass15_0.b_0(I目标)在系统中。林克。可枚举。WhereSelectArrayTerator`2.MoveNext()在系统中。林克。缓冲区`1..ctor(IEnumerable`1源)在系统中。林克。可枚举。ToArray[TSource](IEnumerable `1 source)在Ninject。激活。提供商。StandardProvider。创建(IContext上下文)在Ninject。激活。上下文ResolveInternal(对象范围)在Ninject。激活。上下文Resolve()在Ninject。KernelBase。解析(IRequest请求,布尔句柄MissingBindings)在Ninject。KernelBase。解决(IRequest请求)在Ninject。规划。目标。目标`1.ResolveWithin(IContext父级)在Ninject。激活。提供商。StandardProvider。GetValue(IContext上下文,ITarget目标)在Ninject。激活。提供商。StandardProvider.c_DisplayClass15_0.b_0(I目标)在系统中。林克。可枚举。WhereSelectArrayTerator`2.MoveNext()在系统中。林克。缓冲区`1..ctor(IEnumerable`1源)在系统中。林克。可枚举。ToArray[TSource](IEnumerable `1 source)在Ninject。激活。提供商。StandardProvider。创建(IContext上下文)在Ninject。激活。上下文ResolveInternal(对象范围)在Ninject。激活。上下文Resolve()在Ninject。KernelBase。解析(IRequest请求,布尔句柄MissingBindings)在Ninject。KernelBase。解决(IRequest请求)在Ninject。规划。目标。目标`1.ResolveWithin(IContext父级)在Ninject。激活。提供商。StandardProvider。GetValue(IContext上下文,ITarget目标)在Ninject。激活。提供商。StandardProvider.c_DisplayClass15_0.b_0(I目标)在系统中。林克。可枚举。WhereSelectArrayTerator`2.MoveNext()在系统中。林克。缓冲区`1..ctor(IEnumerable`1源)在系统中。林克。可枚举。ToArray[TSource](IEnumerable `1 source)在Ninject。激活。提供商。StandardProvider。创建(IContext上下文)在Ninject。激活。上下文ResolveInternal(对象范围)在Ninject。激活。上下文Resolve()在Ninject。KernelBase。解析(IRequest请求,布尔句柄MissingBindings)在Ninject。KernelBase。解决(IRequest请求)在Ninject。规划。目标。目标`1.ResolveWithin(IContext父级)在Ninject。激活。策略。PropertyInjectionStrategy。GetValue(IContext上下文、ITarget目标、IEnumerable`1 allPropertyValues)在Ninject。激活。策略。PropertyInjectionStrategy。Activate(IContext上下文,InstanceReference引用)在Ninject。激活。管道.c_DisplayClass6_0.b_0(IActivationStrategy)在Ninject。基础设施语言IEnumerableOfT的扩展。映射[T](IEnumerable`1系列,操作`1操作)在Ninject。激活。管道Activate(IContext上下文,InstanceReference引用)在Ninject。激活。上下文ResolveInternal(对象范围)在Ninject。激活。上下文Resolve()在Ninject。KernelBase。解析(IRequest请求,布尔句柄MissingBindings)在Ninject。KernelBase。解决(IRequest请求)在Ninject。ResolutionExtensions。GetResolutionIterator(IResolutionRoot根,类型服务,函数`2约束,IEnumerable`1参数,布尔值为可选,布尔值唯一)在Ninject。ResolutionExtensions。Get[T](IResolutionRoot根,IParameter[]参数)在C:\Users\Tim\source\repos\TA.SnapCap\TA.SnapCap.Specifications\Contexts\SimulatorTestContextBuilder.Build()中在c:\Users\Tim\source\repos\TA.SnapCap\TA.SnapCap.Specifications\SimulatorSpecs.when_creating_a_fastrongimulator.c.b_5_0()中,我不明白它为什么需要它。正在构造的对象SimulatorStateMachine
具有到构造函数的特定绑定,该构造函数为bool
参数使用常数值。我还使用.WithConstructorArgument()
尝试了一种变体。我的整个作文根包含在下面。如果我取消对
Bind<bool>().ToConstant(false)
行的注释,那么错误就会消失(当然,如果这不是我需要的行为)。很明显,Ninject在某种程度上没有使用我指定的构造函数。你明白为什么会这样吗?我做不到,而且我有点盲目。。。using System; using Ninject; using Ninject.Modules; using NodaTime; using TA.Ascom.ReactiveCommunications; using TA.SnapCap.HardwareSimulator; namespace TA.SnapCap.Specifications.Contexts { class SimulatorTestContextBuilder : NinjectModule { private readonly IKernel testKernel = new StandardKernel(); string connectionString = "Simulator:Fast"; Action<SimulatorStateMachine> initializeStateMachine = machine => { }; // called to initialize the state machine. DO nothing by default. bool openChannel; /// <inheritdoc /> public override void Load() { //Bind<bool>().ToConstant(false); Bind<SimulatorStateMachine>().ToMethod(ctx => new SimulatorStateMachine(true, SystemClock.Instance)); Bind<IClock>().ToMethod(_ => SystemClock.Instance).InSingletonScope(); Bind<SimulatorEndpoint>() .ToMethod(ctx => SimulatorEndpoint.FromConnectionString(connectionString)) .InSingletonScope(); Bind<DeviceEndpoint>().To<SimulatorEndpoint>().InSingletonScope(); Bind<InputParser>().ToSelf().InSingletonScope(); Bind<ISimulatorStateTriggers>().To<SimulatorStateMachine>().InSingletonScope(); Bind<SimulatorCommunicationsChannel>().ToSelf().InSingletonScope(); Bind<ICommunicationChannel>().To<SimulatorCommunicationsChannel>().InSingletonScope(); Bind<SimulatorContext>().ToSelf().InSingletonScope(); } public SimulatorContext Build() { testKernel.Load(this); var context = testKernel.Get<SimulatorContext>(); context.SimulatorChannel.IsOpen = openChannel; initializeStateMachine(context.Simulator); return context; } public SimulatorTestContextBuilder WithFastSimulator() { connectionString = "Simulator:Fast"; return this; } public SimulatorTestContextBuilder WithRealtimeSimulator() { connectionString = "Simulator:Realtime"; return this; } public SimulatorTestContextBuilder WithOpenChannel() { openChannel = true; return this; } public SimulatorTestContextBuilder InClosedState() { initializeStateMachine = machine => machine.Initialize(new StateClosed(machine), testKernel.Get<InputParser>()); return this; } } }
问题出在ISimulatorStateTriggers
的绑定上。应该是:
Bind<ISimulatorStateTriggers>()
.ToMethod(ctx => new SimulatorStateMachine(yourChoiceOfBoolValue, SystemClock.Instance))
.InSingletonScope();
只有当您要解析SimulatorStateMachine
时,才会使用SimulatorStateMachine
的绑定,而这里的情况并非如此。在这种情况下,绑定不是构造函数的重载。