2012-02-29 74 views
7

推导ASP.net MVC4有一个网络API为您的数据模型暴露CRUD功能的这种“新”的概念。这些控制器的基类是DataController,它来源于ApiController为什么不Asp.net网页API控制器从一个IController

不幸的是这ApiController不从IController推导出是有问题的,因为这些要求无法通过正常的自定义控制器厂进行处理,因为这些都应该返回IController一个实例。

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

总之,由于这种继承,你无法使用你的DI容器来注入依赖关系。

回答

7

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

简而言之,尽管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

要与ASP.Net做DI的WebAPI你需要一个解析器扶养您的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依赖注入

+1

我以前用过我自己的控制器工厂,这个类仍然被称为即使对于webapi控制器。我无法让应用程序调用DependencyResolver。所有请求都通过我自己的ControllerFactory(删除这个自定义工厂不会改变这个)。 – thekip 2012-02-29 10:49:13

相关问题