将Ninject与Asp.NET Web API Beta ApiController一起使用

Chr*_*rby 11 asp.net-mvc ninject asp.net-web-api

我被卡住了.我正在使用这里概述的wcf web api p6 Ninject与WCF Web API Preview 5一起使用的方法,但是测试版中的mvc实现有些不同.这里有一篇很好的文章http://www.asp.net/web-api/overview/extensibility/using-the-web-api-dependency-resolver讨论构建自己的自定义依赖项解析器,但是我想使用我用于我的mvc视图控制器的相同实现...例如Ninject.我在文章中也尝试了一些基于IoC Unity示例的内容,但还没有任何内容消失.任何帮助我指向正确方向的人都会非常感激.我也会继续自己挖掘.提前致谢!

这就是我在的地方.我正在使用WebActivator来引导代码,但我已经把它放到了Application_Start()中,只是为了更多的东西.

    protected void Application_Start()
    {
        var kernel = new StandardKernel(new MyNinjectModule());
        GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new NinjectDependencyResolver(kernel));
    }
Run Code Online (Sandbox Code Playgroud)

和我收到以下错误:
类型Ninject.Web.Mvc.NinjectDependencyResolver似乎不执行Microsoft.Practices.ServiceLocation.IServiceLocator.
参数名称:commonServiceLocator

找到解决方案
也许有/将会有一个更优雅的方式,但现在这对我有用.我也在这里添加我的自定义消息处理程序.

[assembly: WebActivator.PreApplicationStartMethod(typeof(MyApp.AppStart.ApiBootstrapper), "Start")]
namespace MyApp.AppStart
{
    public class ApiBootstrapper
    {
        public static void Start()
        {
            var kernel = new StandardKernel(new MyNinjectModule());
            var resolver = new NinjectDependencyResolver(kernel);
            GlobalConfiguration.Configuration.ServiceResolver.SetResolver(resolver.GetService, resolver.GetServices);
            GlobalConfiguration.Configuration.MessageHandlers.Add(new ApiAuthHandler());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Rem*_*oor 3

我从未使用过 WebAPI,但由于 IDependencyResolver 的语义与 MVC3 中的语义完全相同,您应该能够使用相同的实现: https: //github.com/ninject/ninject.web.mvc/blob/master /mvc3/src/Ninject.Web.Mvc/NinjectDependencyResolver.cs

更新:Ninject.Web.WebAPi 扩展添加了对 ApiController 的支持

  • 这实际上是我尝试过的事情之一,不幸的是没有任何乐趣。例如 ServiceResolver.SetResolver(new NinjectDependencyResolver(kernel)) 会产生以下错误: _Ninject.Web.Mvc.NinjectDependencyResolver 似乎未实现 Microsoft.Practices.ServiceLocation.IServiceLocator_ (2认同)