WebAPI中的DependencyResolver.SetResolver和HttpConfiguration.DependencyResolver有什么区别

时间:2013-03-19 08:48:56

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

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

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

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

所以我的问题是DependencyResolver.SetResolverHttpConfiguration.DependecyResolver之间有什么区别?我为什么要指定它们?

3 个答案:

答案 0 :(得分:41)

防止在同一个项目中混合使用MVC和Web API。微软似乎建议这样做,因为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对应程序具有完全相同名称的类(但实现略有不同)。 p>

答案 1 :(得分:39)

我猜你在MVC和Web API之间混淆了:

DependencyResolver.SetResolver

for MVC,属于议会System.Web.Mvc。否则:

Configuration.DependencyResolver

对于Web APi,它属于程序集System.Web.Http

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

答案 2 :(得分:18)

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

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

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

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