【问题标题】:Web API 2 Ninject "error occurred when trying to create a controller"Web API 2 Ninject“尝试创建控制器时发生错误”
【发布时间】:2016-05-02 06:56:51
【问题描述】:

加载控制器时出现此错误。

An error occurred when trying to create a controller of type 'MembersController'. Make sure that the controller has a parameterless public constructor.

我已经添加了

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

注册绑定后到NinjectWebCommon 类。

并且我已经注册了相关服务。请参阅编辑

 private static void RegisterServices(IKernel kernel)
 {
     kernel.Bind<IMembersService, MembersService>();
     kernel.Bind<MemberContext, MemberContext>();
 }        

这是我添加的 ninject 包 -

  <package id="Ninject" version="3.2.0.0" targetFramework="net451" />
  <package id="Ninject.MVC5" version="3.2.1.0" targetFramework="net451" />
  <package id="Ninject.Web.Common" version="3.2.0.0" targetFramework="net451" />
  <package id="Ninject.Web.Common.WebHost" version="3.2.0.0" targetFramework="net451" />
  <package id="Ninject.Web.WebApi" version="3.2.4.0" targetFramework="net451" />
  <package id="Ninject.WebApi.DependencyResolver" version="0.1.4758.24814" targetFramework="net451" />

我错过了什么?

编辑

感谢我与 Jerrod Horton(下图)的交谈,我意识到我的绑定不正确。

应该是

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IMembersService>().To<MembersService>();
    kernel.Bind<MemberContext>().To<MemberContext>();
}

【问题讨论】:

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


    【解决方案1】:

    简答:

    您需要安装所有这些软件包:

    • 忍者
    • Ninject.Extensions.Conventions
    • Ninject.Web.Common
    • Ninject.Web.Mvc
    • Ninject.Web.WebApi
    • Ninject.Web.WebApi.WebHost

    在大多数情况下,缺少其中之一会导致问题。

    【讨论】:

    • 有一个联合 MVC 和 WebAPI 项目 - 在新项目中缺少 Ninject.Web.WebApi,但给了我这个莫名其妙的错误,而不是更合理的错误
    【解决方案2】:

    您的一个依赖项(或依赖项的一个依赖项)未在 IoC 容器中完全注册。当 web api 尝试解析控制器时,如果它没有它需要的每一个依赖项,那么它将失败,如果您的 IoC 容器正在尝试解析 ProductRepository 但 ProductRepository 在其构造函数中需要 ISqlConnectionProvider ,那么您也必须使用您的 IoC 容器注册 ISqlConnectionProvider .

    我将从控制器开始。查看所有输入参数。确保每个都在您的 IoC 容器中注册。然后遍历这些类中的每一个,并确保这些类中的任何依赖项也都已注册(依此类推)。

    这是我拥有的适用于 Ninject 的代码。此代码存在于 App_Start 文件夹中名为 NinjectWebCommon.cs 的文件中

    [assembly: WebActivatorEx.PreApplicationStartMethod(typeof(YourProject.App_Start.NinjectWebCommon), "Start")]
    [assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(YourProject.App_Start.NinjectWebCommon), "Stop")]
    
    namespace YourProject.App_Start
    {
        using System;
        using System.Web;
    
        using Microsoft.Web.Infrastructure.DynamicModuleHelper;
    
        using Ninject;
        using Ninject.Web.Common;
    
        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();
                try
                {
                    kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
                    kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
    
                    RegisterServices(kernel);
                    return kernel;
                }
                catch
                {
                    kernel.Dispose();
                    throw;
                }
            }
    
            /// <summary>
            /// Load your modules or register your services here!
            /// </summary>
            /// <param name="kernel">The kernel.</param>
            private static void RegisterServices(IKernel kernel)
            {
            }        
        }
    }
    

    packages.config Ninject sn-p

      <package id="Ninject" version="3.2.2.0" targetFramework="net45" />
      <package id="Ninject.Web.Common" version="3.2.3.0" targetFramework="net45" />
      <package id="Ninject.Web.Common.WebHost" version="3.2.3.0" targetFramework="net45" />
      <package id="Ninject.Web.WebApi" version="3.2.4.0" targetFramework="net45" />
      <package id="Ninject.Web.WebApi.WebHost" version="3.2.4.0" targetFramework="net45" />
    

    packages.config web api 和 asp.net sn-p

      <package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net45" />
      <package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net45" />
      <package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net45" />
      <package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net45" />
      <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" />
      <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net45" />
      <package id="Microsoft.AspNet.WebApi.HelpPage" version="5.2.0" targetFramework="net45" />
      <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net45" />
      <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net45" />
      <package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.2.0" targetFramework="net45" />
      <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
    

    【讨论】:

    • 我拥有所有两个依赖项。
    • 我编辑了我的回复以包含对我有用的代码。希望这可以帮助你。 ""RegisterServices" 方法是我注册依赖项的方法。
    • 我们 100% 使用 web api 2。我已经使用 packages.config 中的 sn-p 更新了响应。
    • 这似乎对我有用,没问题。我记得你遇到过类似的问题。一旦设置好,它就可以完美运行。如果设置不正确,您就会遇到令人沮丧的问题,例如您遇到的问题。如果您将我拥有的这段代码复制并粘贴到您的代码中,它应该可以工作。确保你已经安装了 MVC Ninject nuget 包(看起来像你)。
    • 我将我拥有的所有 Ninject (逐字)粘贴在我的回复底部,以便您可以看到它们。以防万一,我也会继续发布 Web api 的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 2022-07-17
    • 2020-04-26
    • 2020-02-09
    • 2017-09-18
    相关资源
    最近更新 更多