【问题标题】:Web api is not call my dependency resolverWeb api 不调用我的依赖解析器
【发布时间】:2017-09-13 20:45:27
【问题描述】:

我已经设置了一个非常简单的依赖解析器,但它没有被我的控制器调用。

当我点击 HomeController 时,GetService 被调用:( http:localhost:xxxx/) 但 (http://localhost:xxxx/api/Customers) 不是。

在 Global.asax 我已经放入 Application_Start

        DependencyResolver.SetResolver(new PoorMansResolver());

我的解析器类是

  public class PoorMansResolver : IDependencyResolver
    {
        static readonly ICustomerRepository CustomerRepository = new CustomerRepository();

        public object GetService(Type serviceType)
        {
            if (serviceType == typeof (CustomersController)) 
                return new CustomersController(CustomerRepository);
            else return null;
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            return new List<object>();
        }
    }

为什么没有调用解析器?

【问题讨论】:

    标签: asp.net-web-api


    【解决方案1】:

    您是否为 MVC4 和 WebAPI 设置了解析器?

    这为 mvc (System.Web.Mvc) 设置它:

    DependencyResolver.SetResolver(new PoorMansResolver()); 
    

    但是这为 Web API (System.Web.Http) 设置了它:

    GlobalConfiguration.Configuration.DependencyResolver = new PoorMansResolver();
    

    【讨论】:

    • 哇...这是可怕的重复
    • 哈哈,是的。堆栈的其他部分也是如此,包括路由
    • @JohnnoNolan 另请参阅this post,了解为什么不应该混合它们。
    【解决方案2】:

    WebAPi 和 MVC 控制器的依赖解析器位于不同的命名空间中。您必须为这两个解析器实现一个解析器,并将它们分别分配给 mvc 控制器和 web api 控制器,如下面的 ninjectwebcommon.cs 文件中所示

        private static IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
            kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
    
            RegisterServices(kernel);
    
            DependencyResolver.SetResolver(new NinjectDependencyResolver());
            GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);
            return kernel;
        }
    

    NinjectDependencyResolver 为 MVC 控制器实现 System.Web.Mvc.IDependencyResolver,而 NinjectResolver 为 WebApi 控制器实现 System.Web.Http.Dependencies.IDependencyResolver。

    【讨论】:

      【解决方案3】:

      我会关心您如何/是否连接您的 ControllerFactory。见this SO question。这是关于 Unity 的,但原理是一样的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-08
        • 1970-01-01
        • 2013-04-16
        • 2022-12-07
        相关资源
        最近更新 更多