web-dev-qa-db-fra.com

Quelle est la différence entre DependencyResolver.SetResolver et HttpConfiguration.DependencyResolver dans WebAPI

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?

39
Jevgenij Nekrasov

É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).

41
Steven

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

39
cuongle

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

18
Mark Jones