Qual é a diferença entre DependencyResolver.SetResolver e HttpConfiguration.DependencyResolver no WebAPI

Eu tenho o projeto existente, que usa o AutoFac como IoC.

No código de registro eu tenho estas linhas:

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

Então, minha pergunta é qual é a diferença entre DependencyResolver.SetResolver e HttpConfiguration.DependecyResolver ? Por que devo atribuir os dois?

Evite misturar MVC e API da Web no mesmo projeto. A Microsoft parece sugerir isso, porque o modelo do Visual Studio para API da Web mistura o projeto automaticamente com o MVC, mas essa é uma má ideia.

Do ponto de vista da arquitetura, o MVC e a API da Web são completamente diferentes. O MVC é uma tecnologia de interface do usuário destinada a otimizar a experiência do usuário final. Web API é uma tecnologia de serviço da web que visa otimizar a experiência para o desenvolvedor (cliente).

O MVC e a API da Web não compartilham nenhum código específico da apresentação. Misturá-los no mesmo projeto apenas torna esse projeto maior e mais complicado.

Mas talvez ainda mais importante, os dois tipos de aplicativos têm suas próprias necessidades de configuração de DI. Eles têm seu próprio Root de composição e misturam isso em uma única configuração de DI (um único contêiner DI) pode tornar sua configuração extraordinariamente difícil.

E por último, misturar a API da Web com o MVC no mesmo projeto leva a dolorosos conflitos de nomenclatura ambíguos, já que os assemblies da API da Web contêm muitas classs que compartilham exatamente o mesmo nome das contrapartes do MVC (mas com implementações ligeiramente diferentes).

Eu acho que você misturou entre MVC e API da Web:

 DependencyResolver.SetResolver 

é para MVC e pertence ao assembly System.Web.Mvc . De outra forma:

 Configuration.DependencyResolver 

para o Web APi, ele pertence ao assembly System.Web.Http .

Então, no seu projeto, ele usa o MVC e o Web Api, é por isso que você vê duas linhas para configurar o IoC para cada

DependencyResolver.SetResolver é uma construção MVC e é necessária para suportar o IOC usando MVC.

O GlobalConfiguration.Configuration.DependencyResolver é específico do WebApi.

Você só precisará dos dois se quiser suportar o MVC e o WebApi no mesmo projeto.

Vale a pena ressaltar que você normalmente não precisa definir explicitamente o DependencyResolver.SetResolver pois o Ninject Mvc3 tem um bootstrap para isso … veja aqui