我有现有项目,它使用AutoFac作为IoC。
在注册码中我有以下几行:
var resolver = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(resolver));
config.DependencyResolver = new AutofacWebApiDependencyResolver(resolver);
所以我的问题是DependencyResolver.SetResolver
和HttpConfiguration.DependecyResolver
之间有什么区别?我为什么要指定它们?
答案 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