【问题标题】:Ninject not working in Web API contructor in ASP.NET MVC 4Ninject 在 ASP.NET MVC 4 的 Web API 构造函数中不起作用
【发布时间】:2013-04-05 19:22:07
【问题描述】:

我是 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 错误,内容为

&lt;Error&gt;&lt;Message&gt;An error has occurred.&lt;/Message&gt;&lt;/Error&gt;

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

【问题讨论】:

  • “这不起作用”到底是什么意思?
  • 你看到了什么错误信息?
  • 啊,对不起,我错过了!如果我添加此构造函数,则没有调用 Web Api 方法,我通过使用断点确认了这一点,否则它会调用。浏览器显示一个 xml 错误,内容为 &lt;Error&gt;&lt;Message&gt;An error has occurred.&lt;/Message&gt;&lt;/Error&gt;
  • 你能把你所有的 Ninject 配置代码贴出来吗?
  • Web API 有自己的依赖注入钩子。如果您还没有配置 ninject 来解决 Web api 控制器,那可能就是问题所在 - 当您调用 Web api 操作时,当前不涉及 ninject。 Mark Seemann 在他的网站上的一个例子:blog.ploeh.dk/2012/03/20/RobustDIWithTheASPNETWebAPI.aspx

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


【解决方案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 控制台中运行以下命令以安装 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")]

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

【讨论】:

    【解决方案2】:

    更新: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();
        }
    }
    

    :)

    【讨论】:

    • 这不是真正的依赖注入。 WebApi 和 Ninject 可以完美地协同工作。如果您按照我在回答中提到的步骤操作,它应该可以工作。
    • 正如我之前已经说过的,@WouterdeKort 你的解决方案对我不起作用
    • 同意@WouterdeKort,这不是依赖注入
    猜你喜欢
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    相关资源
    最近更新 更多