Asp.net mvc 4 Ninject在ASP.NET MVC 4中的Web API构造函数中不工作

Asp.net mvc 4 Ninject在ASP.NET MVC 4中的Web API构造函数中不工作,asp.net-mvc-4,asp.net-web-api,ninject,Asp.net Mvc 4,Asp.net Web Api,Ninject,我不熟悉ASP.NET Web API 我已使用将我的ASP.NET MVC 3项目升级为ASP.NET MVC 4 现在我在这里尝试使用Web Api,正如您所看到的,我在这里尝试使用ninject,但是当我以这种方式声明ProductsController构造函数时,这不起作用 public class ProductsController : ApiController { private readonly IProductService _productService;

我不熟悉ASP.NET Web API

我已使用将我的ASP.NET MVC 3项目升级为ASP.NET MVC 4

现在我在这里尝试使用Web Api,正如您所看到的,我在这里尝试使用ninject,但是当我以这种方式声明
ProductsController
构造函数时,这不起作用

public class ProductsController : ApiController
{
    private readonly IProductService _productService;

    public ProductsController(IProductService productService)
    {
        this._productService = productService;
    }

    public List<Product> GetProducts()
    {
        return _productService.GetAllProducts();
    }
}
公共类产品控制器:ApiController
{
私有只读IPProductService\u productService;
公共产品控制器(IPProductService产品服务)
{
这是.\u productService=productService;
}
公共列表产品()
{
return_productService.GetAllProducts();
}
}
请帮我做这个

若我添加了这个构造函数,并没有调用WebAPI方法,我通过使用断点确认了这一点,否则它会调用。 浏览器显示一个xml错误,该错误读取

发生错误。

我的NinjectWebCommon.cs类代码为

[assembly: WebActivator.PreApplicationStartMethod(typeof(Web.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(Web.App_Start.NinjectWebCommon), "Stop")]

namespace Web.App_Start
{
    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);
            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.Bind<IProductService>().To<ProductService>();            
        }        
    }
}
[程序集:WebActivator.PreApplicationStartMethod(typeof(Web.App\u Start.NinjectWebCommon),“Start”)]
[程序集:WebActivator.ApplicationShutdownMethodAttribute(typeof(Web.App_Start.NinjectWebCommon),“Stop”)]
名称空间Web.App\u开始
{
公共静态类NinjectWebCommon
{
私有静态只读引导程序Bootstrapper=new Bootstrapper();
/// 
///启动应用程序
/// 
公共静态void Start()
{
RegisterModule(typeof(OnePerRequestHttpModule));
RegisterModule(typeof(NinjectHttpModule));
初始化(CreateKernel);
}
/// 
///停止应用程序。
/// 
公共静态无效停止()
{
bootstrapper.ShutDown();
}
/// 
///创建将管理应用程序的内核。
/// 
///创建的内核。
私有静态IKernel CreateKernel()
{
var kernel=新的标准内核();
kernel.Bind().ToMethod(ctx=>()=>newbootstrapper().kernel);
kernel.Bind().To();
注册服务(内核);
返回内核;
}
/// 
///在这里加载您的模块或注册您的服务!
/// 
///内核。
私有静态无效注册服务(IKernel内核)
{
kernel.Bind().To();
}        
}
}

您可以按照以下步骤启动并运行WebApi和Ninject:

1创建一个新的WebApi项目 2将字段和构造函数的以下代码添加到默认值控制器:

private IFooService _foo;

public ValuesController(IFooService foo)
{
    _foo = foo;
}
3创建接口IFooService和类FooService

public interface IFooService
{
}

public class FooService : IFooService
{
}
4在Nuget Package Manager控制台中运行以下命令以安装Ninject

安装程序包Ninject.MVC3

5在方法
RegisterServices(IKernel内核)


这些行将确保您的代码在正确的时间执行。

更新:一个超级棒的解释:,现在我不再需要使用
ProductsController():this(new ProductService())

啊,唉,现在这个工作开始了:)

这就是我所做的

我的每个WebApicController都有两个构造函数。例如,对于我的ProductsController,我现在需要定义的构造函数如下所示

public class ProductsController : ApiController
{
    private readonly IProductService _productService;

    public ProductsController(): this(new ProductService())
    {
    }

    public ProductsController(IFolderService productService)
    {
        this._polderService = productService;
    }

    public List<Product> GetProducts()
    {
        return _productService.GetAllProducts();
    }
}
公共类产品控制器:ApiController
{
私有只读IPProductService\u productService;
公共产品控制器():此(新产品服务())
{
}
公共产品控制器(IFolderService productService)
{
这._polderService=productService;
}
公共列表产品()
{
return_productService.GetAllProducts();
}
}

:)

那么“这不起作用”的确切含义是什么?您看到了什么错误消息?啊,对不起,我错过了!若我添加了这个构造函数,并没有调用WebAPI方法,我通过使用断点确认了这一点,否则它会调用。浏览器显示一个xml错误,该错误读取
发生错误。
您可以发布所有的Ninject配置代码吗?Web API有自己的依赖项注入挂钩。如果您还没有将ninject配置为同时解析web api控制器,那么这可能就是问题所在-当您调用web api操作时,ninject当前不参与。MarkSeemann在他的网站上举了一个例子:这不是真正的依赖注入。WebApi和Ninject可以完美地协同工作。如果您按照我在回答中提到的步骤操作,它应该会起作用。正如我之前所说,@WouterdeKort您的解决方案对@WouterdeKort的meAgree不起作用,这不是依赖注入
[assembly: WebActivator.PreApplicationStartMethod(typeof(WebApiNinjectTest.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(WebApiNinjectTest.App_Start.NinjectWebCommon), "Stop")]
public class ProductsController : ApiController
{
    private readonly IProductService _productService;

    public ProductsController(): this(new ProductService())
    {
    }

    public ProductsController(IFolderService productService)
    {
        this._polderService = productService;
    }

    public List<Product> GetProducts()
    {
        return _productService.GetAllProducts();
    }
}