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

Jev*_*sov 39 c# asp.net-mvc autofac asp.net-web-api

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

在注册码中我有这些线:

var resolver = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(resolver));
config.DependencyResolver = new AutofacWebApiDependencyResolver(resolver);
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*ven 41

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

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

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

但也许更重要的是,两种应用程序类型都有自己的DI配置需求.他们有自己的组合根,并将其混合到单个DI配置(单个DI容器)可以使您的配置非常困难.

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

  • 令人惊讶的是事情的发展日期.现在随着MVC 6的到来,WebApi已经直接集成到MVC中. (4认同)
  • 多个终端应用程序重用相同的业务层或其他共享程序集非常常见.如果您发现自己在MVC和Web API项目中都复制了代码,那么您就错过了一个共享程序集.对于某些部分,DI配置看起来像这样,DRY原则仍然存在:通过将该部分提取到共享程序集来防止重复,并让每个最终应用程序以适合其需要的方式完成配置. (3认同)
  • @rism:我认为事情没有过时,因为大多数论点仍然存在:1.从架构的角度来看,MVC和Web API完全不同.2. MVC和Web API不共享任何特定于演示文稿的代码.3.两种应用类型都有自己的DI配置需求.关于痛苦的模糊命名冲突的最后一点将随着MVC6而消失. (3认同)
  • @Steven-这样的回答真的根本没有帮助,并且出于这个原因我拒绝了。马克的解释才是真正需要的(解释了两把左轮手枪之间的区别),出于这个原因,我也投了赞成票。除非Jevgenij的问题已被编辑,否则AutoFac根本不会提到MVC。 (2认同)

cuo*_*gle 39

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

DependencyResolver.SetResolver
Run Code Online (Sandbox Code Playgroud)

适用于MVC并属于程序集 System.Web.Mvc.除此以外:

Configuration.DependencyResolver
Run Code Online (Sandbox Code Playgroud)

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

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

  • 对于提出的问题,这也是一个简洁而恰当的答案,所以我也投票赞成。 (2认同)

Mar*_*nes 18

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

GlobalConfiguration.Configuration.DependencyResolver是WebApi特定的.

如果要在同一项目中同时支持MVC和WebApi,则只需要两者.

也许值得指出的是,你通常不需要明确设置DependencyResolver.SetResolver为Ninject Mvc3有一个这样的引导程序...请看这里