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