J'ai un projet existant, qui utilise AutoFac comme IoC.
Dans le code d'enregistrement, j'ai ces lignes:
var resolver = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(resolver));
config.DependencyResolver = new AutofacWebApiDependencyResolver(resolver);
Ma question est donc quelle est la différence entre DependencyResolver.SetResolver
et HttpConfiguration.DependecyResolver
? Pourquoi devrais-je les affecter tous les deux?
Évitez de mélanger MVC et l'API Web dans le même projet. Microsoft semble suggérer cela, car le modèle Visual Studio pour l'API Web mélange automatiquement le projet avec MVC, mais c'est une mauvaise idée.
D'un point de vue architectural, MVC et l'API Web sont complètement différents. MVC est une technologie d'interface utilisateur visant à optimiser l'expérience de l'utilisateur final. L'API Web est une technologie de service Web qui vise à optimiser l'expérience du développeur (client).
MVC et l'API Web ne partagent aucun code spécifique à la présentation. Les mélanger dans le même projet rend ce projet plus grand et plus compliqué.
Mais peut-être plus important encore, les deux types d'application ont leurs propres besoins de configuration DI. Ils ont leur propre Composition Root et le mélanger dans une configuration DI unique (un seul conteneur DI) peut rendre votre configuration extrêmement difficile.
Et enfin, mélanger l'API Web avec MVC dans le même projet conduit à de douloureux conflits de nommage ambigus, car les assemblys d'API Web contiennent de nombreuses classes qui partagent exactement le même nom que leurs homologues MVC (mais avec des implémentations légèrement différentes).
Je suppose que vous vous êtes mélangé entre MVC et API Web:
DependencyResolver.SetResolver
est pour MVC et appartient à l'assembly System.Web.Mvc
. Autrement:
Configuration.DependencyResolver
pour Web APi, il appartient à Assembly System.Web.Http
.
Donc, dans votre projet, il utilise à la fois MVC et Web Api, c'est pourquoi vous voyez deux lignes pour configurer l'IoC pour chaque
DependencyResolver.SetResolver
est une construction MVC et doit prendre en charge IOC en utilisant MVC.
Le GlobalConfiguration.Configuration.DependencyResolver
est spécifique à WebApi.
Vous n'aurez besoin des deux que si vous souhaitez prendre en charge MVC et WebApi dans le même projet.
Il convient également de souligner que vous n'avez normalement pas besoin de définir explicitement le DependencyResolver.SetResolver
comme le Ninject Mvc3 a un bootstrap pour cela ... voir ici