【问题标题】:Ninject WebApi error for parameterless controller无参数控制器的 Ninject WebApi 错误
【发布时间】:2017-10-27 17:15:19
【问题描述】:

我已经阅读了我能找到的所有 Stack Overflow 问题,但无济于事。当我通过 NuGet 安装 Ninject 包时,没有安装 NinjectWebCommon.cs 类,所以我编写了自己的代码(如下)。我安装了 Ninject、Ninject.WebCommon、Ninject.Webcommon.Webhost、Ninject.WebApi、Ninject.WebApi.DependencyResolver。但是,我在控制器中收到众所周知的消息,即我必须有一个无参数控制器,这当然是我不想要的,因为我需要 DI。

这是我创建的 Ninject 类:

public static class NinjectWebCommon
{
    private static readonly Bootstrapper bootstrapper = new Bootstrapper();


    /// <summary> 
    /// Starts the application 
    /// </summary> 
    public static void Start()
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);
    }

    /// <summary> 
    /// Stops the application. 
    /// </summary> 
    public static void Stop()
    {
        bootstrapper.ShutDown();
    }

    /// <summary> 
    /// Creates the kernel that will manage your application. 
    /// </summary> 
    /// <returns>The created kernel.</returns> 
    private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

        RegisterServices(kernel);
        System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = new Ninject.WebApi.DependencyResolver.NinjectDependencyResolver(kernel);
        return kernel;
    }


    /// <summary> 
    /// Load your modules or register your services here! 
    /// </summary> 
    /// <param name="kernel">The kernel.</param> 
    private static void RegisterServices(IKernel kernel)
    {
        //kernel.Load(Assembly.GetExecutingAssembly());
        kernel.Bind<IUnitsSL>().To<UnitsSL>();
        kernel.Bind<IForecastLogic>().To<ForecastLogic>();
        kernel.Bind<IForecastRepositoryAsync>().To<ForecastRepositoryAsync>();
    }
}

这是控制器

namespace ForecastApi.Controllers
{
  public class ForecastController : ApiController
{
    private IUnitsSL _serviceLayer { get; set; }
    private readonly IForecastLogic _forecastLogic;
    public ForecastController(IForecastLogic forecastLogic)
    {
        _forecastLogic = forecastLogic;
        _serviceLayer = new UnitsSL();
    }
[Route("projection")]
    [HttpPost]
    public async Task<IHttpActionResult> GetDemandForecast([FromBody] 
ProjectionRequestModel model)
    {
        var retVal = await _forecastLogic.GetDemandForecastData(model);
        return Ok(retVal);
    }
}

当我通过 Postman 测试时,错误消息的确切措辞是:尝试创建类型为“ForecastController”的控制器时发生错误。确保控制器有一个无参数的公共构造函数。”

如果有帮助,我正在模拟业务调用的单元测试,他们正在使用 Ninject 库和 Moq。似乎是构造函数失败了。

TIA

【问题讨论】:

  • 如果您将 MVC 和 Web API 放在同一个项目中,MVC5, Web API 2 and Ninject 也可能会有所帮助。
  • 在问这个问题之前,我查看了另一个问题,那里的答案没有帮助。我确实有 Mvc5 Ninject 包,其他任何一个都需要 Ninject 包,所以我不知道您所说的“它可能会有所帮助”是什么意思。
  • 错误信息常常具有误导性。问题可能出在 ForeCastLogic 实例化链中。尝试一一添加你的依赖,看看什么时候解决失败
  • 这不是相关问题的重复。

标签: c# asp.net-web-api ninject


【解决方案1】:

无论出于何种原因,完全卸载 Ninject 并重新安装它(这是 3.3 版)解决了这个问题。如果其他人有类似的问题,请把它留在这里。我原来安装的

  • 忍者
  • Ninject.Web.Common
  • Ninject.Web.Common.WebHost
  • Ninject.Web.WebApi
  • Ninject.Web.WebApi.WebHost

当我卸载所有这些软件包,然后再次重新安装它们 v3.3 时,添加了 NinjectWebCommon.cs 文件并且一切正常。我只能假设当我滚动我自己的通用文件以弥补 Ninject 没有在第一次安装它时丢失了一些东西。

【讨论】:

    猜你喜欢
    • 2014-08-03
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多