web-dev-qa-db-fra.com

IController vs ControllerBase vs Controller vs MyController?

J'ai un projet ASP.NET MVC que je construis et que je cherchais dans la documentation lorsque je suis tombé sur la façon dont la classe Controller est implémentée. Je connais assez bien OOP mais j'ai quelques questions sur la raison pour laquelle il est implémenté de cette manière.

J'ai regardé codeproject et quelques débordement de pile questions mais je n'ai pas trouvé exactement la même question que je me posais.

  1. dans MVC 5 Quel est le but de cette chaîne: IController -> ControllerBase -> Controller -> MyController.
  2. Si ControllerBase est censé être le minimum nécessaire pour créer un contrôleur, alors pourquoi avoir une classe Controller? Ou vice versa si Controller est l'implémentation minimale, alors ControllerBase n'est pas vraiment une classe de base?

Merci d'avance!

20
David Bell

Dans MVC 5, ControllerBase agit uniquement comme une classe de base pour une utilisation principalement interne et implémente en interne la IController.Execute(RequestContext requestContext), et voici la liste des utilisations que j'ai obtenues de Resharper enter image description here

Controller implémente ensuite toutes les fonctionnalités pour les filtres, le modèle et la liaison de vue. Par conséquent, pour implémenter votre MyController, vous devez dériver de Controller

Votre SO référence a déjà expliqué le but de ControllerBase et Controller.

La chose semble beaucoup plus intéressante dans MVC 6 (appelé par la suite ASP.NET MVC Core) lorsque l'équipe ASP.NET a convergé MVC, WebAPI en un seul framework

Veuillez consulter le code source de la classe Controller et ControllerBase dans GitHub pour ASP.NET Core 1.1.1. Dans le <summary> tag pour chaque classe, ils disent:

Controler.cs

Une classe de base pour un contrôleur MVC avec prise en charge de la vue .

ControllerBase.cs

Une classe de base pour un contrôleur MVC sans prise en charge de la vue.

Vous pouvez demander quand utiliser ControllerBase. Mon instinct me dit que si j'utilise uniquement ASP.NET MVC pour WebAPI et ne nécessite pas la fonctionnalité View, vous pouvez dériver votre MyController directement à partir de ControllerBase. La plupart du temps, vous pouvez dériver de Controller même si vous n'utilisez pas View et renvoyez uniquement une chaîne ou JSON pour WebAPI. Controller.cs vous permet de renvoyer un View et de profiter de la liaison automatique.

49
LxL