缺少无参数构造函数 - NInject 依赖注入

问题描述 投票:0回答:2

我曾尝试使用 Ninject 3 将“RuleChecker”注入我的控制器,但它不起作用。

错误“确保控制器具有无参数的公共构造函数。”

我已经阅读了大部分具有类似问题的主题,但找不到适合我的案例的解决方案。

应该很简单,但我不知道如何让它工作。 谢谢

public class CarController : ApiController
{
    private readonly IRule rule;

    public CarController(IRule rule)
    {
        this.rule = rule;
    }
}



public class RuleChecker : IRule
{

    private ICheckCar CarData { get; }
    private IRuleSet RuleSet { get; } 
    private IFactory Factory { get; }    

    public RuleChecker(ICheckCar carData, IRuleSet ruleset,
                               IFactory factory)
    {
              CareData= cardata;
              RuleSet = ruleSet;
              Factory = factory;
    }
}

几个我尝试过但不起作用的例子

    private static void RegisterServices(IKernel kernel)
    {
           kernel. Bind<IRule>().To<RuleChecker>();
           
           //OR

           kernel.Bind<IRule>()
               .ToConstructor(
                    ctorArg => new RuleChecker(
                        ctorArg.Inject<ICarData>(),
                        ctorArg.Inject<IRuleSet>(),
                        ctorArg.Inject<IFactory>()
                    )
                );
   }

注入:

private static IKernel CreateKernel()
        {
            var kernel = default(IKernel);
            try
            {
                kernel = CommonDependencyRegistration.Setup();
                kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
                kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
                RegisterServices(kernel);
                GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
                return kernel;
            }
            catch
            {
                kernel?.Dispose();
                throw;
            }
        }

Global.asax

 public class WebApiApplication : HttpApplication
    {
        protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);

            var config = GlobalConfiguration.Configuration;
            config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
                (new Newtonsoft.Json.Converters.StringEnumConverter());
        }
    }
c# asp.net asp.net-web-api dependency-injection ninject
2个回答
0
投票

您可以使用

ToMethod()
创建
RuleChecker
的实例并注入依赖项。应该这样做。

Bind<IRule>().ToMethod(context =>
    new RuleChecker(
        context.Kernel.Get<ICheckCar>(),
        context.Kernel.Get<IRuleSet>(),
        context.Kernel.Get<IFactory>()
    )
);

0
投票

ASP.Net 需要默认的 ctor.
您需要通过 NInject(或任何其他 di 容器)解析控制器。只有这样你才能注入控制器。 s.https://stackoverflow.com/questions/14016727/how-to-use-ninject-with-asp-net-web-api

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