当我用常量值参数指定构造函数时,Ninject为什么坚持要绑定Bool?

问题描述 投票:1回答:1

我遇到了一个N​​inject问题,我似乎不太能深入研究。也许您可以看到一些明显的我想念的东西。我收到一个绑定错误,它希望我为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;
            }
        }
    }
c# dependency-injection ninject
1个回答
0
投票

问题在于您绑定了ISimulatorStateTriggers。应该是:

Bind<ISimulatorStateTriggers>()
  .ToMethod(ctx => new SimulatorStateMachine(yourChoiceOfBoolValue, SystemClock.Instance))
  .InSingletonScope();

SimulatorStateMachine的绑定仅在您要解析SimulatorStateMachine时使用,在此情况并非如此。在这种情况下,绑定不是构造函数的重载。

© www.soinside.com 2019 - 2024. All rights reserved.