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

时间:2012-10-02 10:03:49

标签: asp.net-mvc-4 asp.net-web-api ninject

我是ASP.NET Web API的新手。

我已使用this tutorial将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();
    }
}

请帮我解决这个问题。

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

<Error><Message>An error has occurred.</Message></Error>

我的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>();            
        }        
    }
}

2 个答案:

答案 0 :(得分:1)

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

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

private IFooService _foo;

public ValuesController(IFooService foo)
{
    _foo = foo;
}

3创建一个接口IFooService和一个类FooService

public interface IFooService
{
}

public class FooService : IFooService
{
}

4在Nuget Packag Manager Console中运行以下命令以安装Ninject

安装包Ninject.MVC3

5在方法RegisterServices(IKernel kernel)中将以下绑定添加到App_Start \ NinjectWebCommon.cs

  kernel.Bind<IFooService>().To<FooService>().InRequestScope();

在您的代码中,您可能没有在适当的时候调用NInject配置。当您使用Nuget包时,您将在Ninject文件的顶部获得以下行:

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

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

答案 1 :(得分:-9)

更新:一个非常棒的解释:http://www.strathweb.com/2012/05/using-ninject-with-the-latest-asp-net-web-api-source/,现在我不再需要使用ProductsController(): this(new ProductService())

唉,阿拉斯现在正在努力:)

这就是我做的......

我的每个WebApiController都有两个构造函数。例如,对于我的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();
    }
}

:)