40

我有现有的项目,它使用 AutoFac 作为 IoC。

在注册码中,我有以下几行:

var resolver = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(resolver));
config.DependencyResolver = new AutofacWebApiDependencyResolver(resolver);

DependencyResolver.SetResolver所以我的问题是和有什么区别HttpConfiguration.DependecyResolver?为什么我要同时分配它们?

4

3 回答 3

44

防止在同一个项目中混合 MVC 和 Web API。Microsoft 似乎建议这样做,因为 Web API 的 Visual Studio 模板自动将项目与 MVC 混合,但这是一个坏主意。

从架构的角度来看,MVC 和 Web API 是完全不同的。MVC 是一种旨在优化最终用户体验的 UI 技术。Web API 是一种 Web 服务技术,旨在优化(客户端)开发人员的体验。

MVC 和 Web API 不共享任何特定于演示的代码。将它们混合在同一个项目中只会使该项目更大更复杂。

但也许更重要的是,这两种应用程序类型都有自己的 DI 配置需求。它们有自己的Composition Root并将其混合到单个 DI 配置(单个 DI 容器)中可以使您的配置异常困难。

最后,在同一个项目中将 Web API 与 MVC 混合会导致痛苦的模棱两可的命名冲突,因为 Web API 程序集包含许多与 MVC 对应项具有完全相同名称的类(但实现方式略有不同)。

于 2013-03-19T09:42:14.567 回答
42

我猜你混淆了 MVC 和 Web API:

DependencyResolver.SetResolver

用于MVC并且属于 assembly System.Web.Mvc。除此以外:

Configuration.DependencyResolver

对于 Web APi,它属于 assembly System.Web.Http

因此,在您的项目中,它同时使用 MVC 和 Web Api,这就是为什么您会看到两行来为每个配置 IoC

于 2013-03-19T08:58:23.087 回答
19

DependencyResolver.SetResolver是一个 MVC 结构,需要使用 MVC 支持 IOC。

GlobalConfiguration.Configuration.DependencyResolver是特定于 WebApi 的。

如果你想在同一个项目中同时支持 MVC 和 WebApi,你只需要两者。

还可能值得指出的是,您通常不需要显式设置,DependencyResolver.SetResolver因为 Ninject Mvc3 有一个引导程序...请参阅此处

于 2013-03-19T08:53:55.463 回答