我遇到了一个Ninject问题,我似乎不太能深入研究。也许您可以看到一些明显的我想念的东西。我收到一个绑定错误,它希望我为Bool绑定:
Ninject.ActivationException:激活布尔时出错没有匹配的绑定可用,并且类型不是自绑定的。激活路径:5)将依赖项布尔注入到SimulatorStateMachine类型的构造函数的参数realTime中4)将依赖项ISimulatorStateTriggers注入参数state中InputParser类型的构造函数的机器3)将依赖InputParser注入到SimulatorCommunicationsChannel类型的构造函数的参数解析器中2)将依赖项ICommunicationChannel注入到SimulatorContext类型的属性Channel中1)请求SimulatorContext意见建议:1)确保已为bool定义了绑定。2)如果绑定是在模块中定义的,请确保已将模块加载到内核中。3)确保您没有意外地创建了多个内核。4)如果使用构造函数参数,请确保参数名称与构造函数参数名称匹配。5)如果使用自动模块加载,请确保搜索路径和过滤器正确。在Ninject.KernelBase.Resolve(IRequest请求,布尔值handleMissingBindings)在Ninject.KernelBase.Resolve(IRequest请求)在Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent)处在Ninject.Activation.Providers.StandardProvider.GetValue(IContext上下文,ITarget目标)在Ninject.Activation.Providers.StandardProvider.c__DisplayClass15_0.b__0(ITarget目标)在System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()在System.Linq.Buffer`1..ctor(IEnumerable`1源)在System.Linq.Enumerable.ToArray [TSource](IEnumerable`1源)处在Ninject.Activation.Providers.StandardProvider.Create(IContext上下文)在Ninject.Activation.Context.ResolveInternal(对象范围)在Ninject.Activation.Context.Resolve()在Ninject.KernelBase.Resolve(IRequest请求,布尔值handleMissingBindings)在Ninject.KernelBase.Resolve(IRequest请求)在Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent)处在Ninject.Activation.Providers.StandardProvider.GetValue(IContext上下文,ITarget目标)在Ninject.Activation.Providers.StandardProvider.c__DisplayClass15_0.b__0(ITarget目标)在System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()在System.Linq.Buffer`1..ctor(IEnumerable`1源)在System.Linq.Enumerable.ToArray [TSource](IEnumerable`1源)处在Ninject.Activation.Providers.StandardProvider.Create(IContext上下文)在Ninject.Activation.Context.ResolveInternal(对象范围)在Ninject.Activation.Context.Resolve()在Ninject.KernelBase.Resolve(IRequest请求,布尔值handleMissingBindings)在Ninject.KernelBase.Resolve(IRequest请求)在Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent)处在Ninject.Activation.Providers.StandardProvider.GetValue(IContext上下文,ITarget目标)在Ninject.Activation.Providers.StandardProvider.c__DisplayClass15_0.b__0(ITarget目标)在System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()在System.Linq.Buffer`1..ctor(IEnumerable`1源)在System.Linq.Enumerable.ToArray [TSource](IEnumerable`1源)处在Ninject.Activation.Providers.StandardProvider.Create(IContext上下文)在Ninject.Activation.Context.ResolveInternal(对象范围)在Ninject.Activation.Context.Resolve()在Ninject.KernelBase.Resolve(IRequest请求,布尔值handleMissingBindings)在Ninject.KernelBase.Resolve(IRequest请求)在Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent)处在Ninject.Activation.Strategies.PropertyInjectionStrategy.GetValue(IContext上下文,ITarget目标,IEnumerable`1 allPropertyValues)在Ninject.Activation.Strategies.PropertyInjectionStrategy.Activate(IContext上下文,InstanceReference参考)在Ninject.Activation.Pipeline.c__DisplayClass6_0.b__0(IActivationStrategy s)在Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map [T](IEnumerable`1系列,Action`1操作)在Ninject.Activation.Pipeline.Activate(IContext上下文,InstanceReference参考)在Ninject.Activation.Context.ResolveInternal(对象范围)在Ninject.Activation.Context.Resolve()在Ninject.KernelBase.Resolve(IRequest请求,布尔值handleMissingBindings)在Ninject.KernelBase.Resolve(IRequest请求)在Ninject.ResolutionExtensions.GetResolutionIterator(IResolutionRoot根,类型服务,Func`2约束,IEnumerable`1参数,布尔值isOptional,布尔值isUnique)在Ninject.ResolutionExtensions.Get [T](IResolutionRoot根,IParameter []参数)在C:\ Users \ Tim \ source \ repos \ ta.snapcap \ TA.SnapCap.Specifications \ Contexts \ SimulatorTestContextBuilder.cs:line 44处的TA.SnapCap.Specifications.Contexts.SimulatorTestContextBuilder.Build()在TA.SnapCap.Specifications.SimulatorSpecs.when_creating_a_fast_simulator.c.b__5_0()在C:\ Users \ Tim \ source \ repos \ ta.snapcap \ TA.SnapCap.Specifications \ SimulatorSpecs \ CreationSpecs.cs:line 32
我不明白为什么需要它。正在构造的对象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
时使用,在此情况并非如此。在这种情况下,绑定不是构造函数的重载。