为什么Asp.net web api控制器不是来自IController

时间:2012-02-29 09:09:35

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-web-api

在ASP.net MVC4中,有一个用于在数据模型上公开CRUD功能的Web API的“新”概念。这些控制器的基类是DataController,它派生自ApiController

不幸的是,这个ApiController并非来自IController这是有问题的,因为这些请求无法通过普通的自定义控制器工厂处理,因为它们应该返回{{1}的实例}。

有没有人知道这背后的原因,因为我无法理解为什么你的MVC项目中的控制器不会派生自IController,因为这会破坏你的自定义控制器工厂,因为它无法实例化项目中的每个控制器。

简而言之,由于这种继承,您无法使用DI容器来注入依赖项。

2 个答案:

答案 0 :(得分:7)

我也向微软发送了同样的问题,得到了Eilon Lipton的以下回复(thx for the):

  

简短的故事是,虽然ASP.NET MVC和ASP.NET Web API共享许多相同的设计概念(依赖注入,许多接口以插入自定义实现,并且易于测试),但它们构建在不同的底层HTTP堆栈。 MVC建立在已在ASP.NET中使用了10多年的System.Web堆栈之上。 Web API构建在新的System.Net.Http堆栈上,为托管(IIS +自定义主机+单元测试主机)提供了更大的灵活性,以及​​更好的可测试性和可扩展性。如果比较IController和IHttpController,你会发现在堆栈中上下使用System.Web,而另一个根本不使用它。

     

无论如何,构建在ASP.NET堆栈上的所有技术 - MVC,Web窗体,Web API,Web页面(和Razor) - 将继续在应用程序中并行工作,允许您选择合适的部分来构建应用程序的每个部分。虽然每个部分中的组件的单独实现是不可互换的,但它们每个都可以连接到相同的服务,例如依赖注入系统,日志工具,数据提供者等等。

     

一旦我们发表关于这个主题的帖子,我认为应该进一步澄清事情。

答案 1 :(得分:1)

要使用ASP.Net WebAPI进行DI,您需要为DI容器制作一个依赖性解析器。

以下适用于Ninject

public class NinjectDependencyResolver : System.Web.Http.Services.IDependencyResolver
{
    private static IKernel m_Kernel;

    public NinjectDependencyResolver()
    {
        m_Kernel = new StandardKernel();
    }

    public NinjectDependencyResolver(IKernel myKernel)
    {
        m_Kernel = myKernel;
    }

    public object GetService(Type serviceType)
    {
        return m_Kernel.TryGet(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return m_Kernel.GetAll(serviceType);
    }
}

然后使用:

将其绑定在Global.ascx文件中
GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new NinjectDependencyResolver(yourKernel));

这与MVC3依赖注入类似(但不完全相同)