为什么 Ninject 坚持在我指定具有常量值参数的构造函数时绑定 Bool?



我遇到了一个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的绑定,而这里的情况并非如此。在这种情况下,绑定不是构造函数的重载。

最新更新