zoukankan      html  css  js  c++  java
  • Ninject对Web Api的支持问题

    问题描述:

    昨天将MVC从3升级到了4,主要是想利用其中的Web Api功能。创建了一个继承自ApiController的控制器,并且跟以前普通控制器一样,构造函数的参数采用Ninject进行依赖注入。之后调用其中某个方法,却发现提示这个控制器没有默认构造函数,经过搜索,发现Ninject目前不直接支持对ApiController的依赖注入,仅仅支持普通控制器(继承自Controller)。

    解决方法:
    google了一下,发现有很多文章介绍解决方法,都是如下思路:

    1.nuget安装Ninject.Web.WebApi包

    2.在global.asax中设定:

     GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
    然而如此操作后发现第二步骤这个代码根本无法成功编译,提示两个类型并没有隐式转换关系。

    经过半天的问题查找,终于发现,以上这个方法已经不再支持最新版本的ASP.NET Web API,如果当前版本WebApi是rc及以上,则上面方法就不再试用。然而,即使是Codeplex目前最新的(9.23日为止)Ninject或Ninject.Web.WebApi都尚未支持新的WebApi。

    实际上二月份ASP.NET Web API  beta出来时,许多IoC都公布了支持WebApi方法,也就是利用IDependencyResolver适配器来实现支持,上面那个方法就是这时候出来的。

    目前如果想Ninject支持最新版Web Api,有一个解决方法:

    1.卸载Ninject.Web.WebApi,nuget上安装Ninject.MVC3(是的,他也支持MVC4)包。

    2.定义两个类,用于实现最新版Web Api要求的IDependencyResolver:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public class NinjectScope : IDependencyScope
        {
            protected IResolutionRoot resolutionRoot;
     
            public NinjectScope(IResolutionRoot kernel)
            {
                resolutionRoot = kernel;
            }
     
            public object GetService(Type serviceType)
            {
                IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
                return resolutionRoot.Resolve(request).SingleOrDefault();
            }
     
            public IEnumerable<object> GetServices(Type serviceType)
            {
                IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
                return resolutionRoot.Resolve(request).ToList();
            }
     
            public void Dispose()
            {
                IDisposable disposable = (IDisposable)resolutionRoot;
                if (disposable != null) disposable.Dispose();
                resolutionRoot = null;
            }
        }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class NinjectResolver : NinjectScope, IDependencyResolver
    {
    private IKernel _kernel;
    public NinjectResolver(IKernel kernel)
    : base(kernel)
    {
    _kernel = kernel;
    }
    public IDependencyScope BeginScope()
    {
    return new NinjectScope(_kernel.BeginBlock());
    }
    }

    3.在NinjectWebCommon.cs或Global.asax中,添加如下代码,注册上面的支持WebApi的解析器

    GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);

    这样,此问题得到解决。其他的Ioc,比如Autofac,也有类似解决方式,查找答案时,应注意版本支持。

    经验:

    升级某一个框架要谨慎,看其他相关框架是否同步支持这一升级。

    开源软件选择很重要,一旦停止或很久不更新,将导致整体项目迁移困难。

    参考:

    <Issue using ASP.Net MVC 4 Web API with Ninject.Web.WebApi>

    <Using Ninject with the latest ASP.NET Web API source>

    作者:lerit
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    数据结构之队列java版
    SPSS-相关性和回归分析(一元线性方程)案例解析(转)
    SPSS-非参数检验—两独立样本检验 案例解析(转)
    spss-非参数检验-K多个独立样本检验( Kruskal-Wallis检验)案例解析(转)
    SPSS-Friedman 秩和检验-非参数检验-K个相关样本检验 案例解析(转)
    SPSS-多重响应-频率和交叉表案例分析(问卷调查分析)(转)
    SPSS—回归—多元线性回归(转)
    SPSS—回归—曲线估计方程案例解析(转)
    SPSS—非线性回归(模型表达式)案例解析(转)
    SPSS—二元Logistic回归(转)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2701077.html
Copyright © 2011-2022 走看看