formulaire Quels sont les bons candidats pour la classe de contrôleur de base dans ASP.NET MVC?




asp net mvc razor view (8)

J'ai vu beaucoup de gens parler de l'utilisation de contrôleurs de base dans leurs projets ASP.NET MVC. Les exemples typiques que j'ai vus le font pour la diagraphie ou peut-être un échafaudage CRUD. Quels sont les autres bons usages d'une classe de contrôleur de base?


Answer #1

Il n'y a pas de bonnes utilisations d'une classe de contrôleur de base.

Maintenant, écoute-moi.

Asp.Net MVC, en particulier MVC 3, contient des tonnes de crochets d’extensibilité qui offrent un moyen plus découplé d’ajouter des fonctionnalités à tous les contrôleurs. Étant donné que vos classes de contrôleurs sont très importantes et essentielles à une application, il est très important de les garder légères, agiles et facilement couplées à tout le reste.

  • L'infrastructure de journalisation appartient à un constructeur et doit être injectée via une structure DI.

  • L'échafaudage CRUD doit être géré par la génération de code ou par un fournisseur ModelMetadata personnalisé.

  • La gestion des exceptions globales doit être gérée par un ActionInvoker personnalisé.

  • Les données de vue globales et l'autorisation doivent être gérées par des filtres d'action. Encore plus facile avec les filtres d'action globaux dans MVC3.

  • Les constantes peuvent aller dans une autre classe / fichier appelée ApplicationConstants ou quelque chose.

Les contrôleurs de base sont généralement utilisés par les développeurs MVC inexpérimentés qui ne connaissent pas toutes les pièces d'extensibilité de MVC. Maintenant, ne vous méprenez pas, je ne juge pas et travaille avec des gens qui les utilisent pour toutes les mauvaises raisons. Sa juste expérience vous offre plus d'outils pour résoudre des problèmes courants.

Je suis presque positif, il n'y a pas un seul problème que vous ne pouvez pas résoudre avec un autre crochet d'extensibilité qu'une classe de contrôleur de base. Ne prenez pas la forme la plus stricte de couplage (héritage) sauf s'il existe une raison de productivité significative et que vous ne violez pas Liskov. Je préférerais plutôt prendre la <1 seconde pour taper une propriété 20 fois à travers mes contrôleurs comme public ILogger Logger { get; set; } public ILogger Logger { get; set; } public ILogger Logger { get; set; } que d'introduire un couplage étroit qui affecte l'application de manière beaucoup plus significative.

Même quelque chose comme un ID utilisateur ou une clé multi-locataire peut aller dans un ControllerFactory au lieu d'un contrôleur de base. Le coût de couplage d'une classe de contrôleur de base ne vaut tout simplement pas la peine.



Answer #3

J'ai utilisé un contrôleur de base dans beaucoup de mes projets et j'ai travaillé de manière fantastique. J'ai surtout utilisé pour

  • Journalisation des exceptions
  • Notification (succès, erreur, ajout ..)
  • Invoquer la gestion des erreurs HTTP404

Answer #4

Nous utilisons le BaseController pour deux choses:

  1. Attributs à appliquer à tous les contrôleurs.
  2. Un remplacement de la redirection, qui protège contre les attaques par redirection ouverte en vérifiant que l'URL de redirection est une URL locale. De cette façon, tous les contrôleurs qui appellent Redirect sont protégés.

Answer #5

D'après mon expérience, la majeure partie de la logique que vous souhaitez intégrer à un contrôleur de base irait idéalement dans un filtre d'action. Les filtres d'action ne peuvent être initialisés qu'avec des constantes. Dans certains cas, vous ne pouvez pas le faire. Dans certains cas, vous avez besoin de l'action à appliquer à chaque méthode d'action du système, auquel cas il peut être plus judicieux de placer votre logique dans une base plutôt que d'annoter chaque méthode d'action avec un nouvel attribut actionFilter.

J'ai également trouvé utile de placer des services référençant des services (qui sont découplés du contrôleur) dans la base, ce qui facilite leur accès et leur initialisation constante.


Answer #6

Le filtre n'est pas sûr pour les threads, la condition d'accès aux bases de données et l'injection de dépendances, les connexions aux bases de données peuvent être fermées par d'autres threads lorsque vous l'utilisez.


Answer #7

Je l'utilise pour accéder à la session, aux données d'application, etc.

J'ai aussi un objet d'application qui contient des choses comme le nom de l'application, etc. et j'y accède depuis la classe de base

Essentiellement je l'utilise pour les choses que je répète beaucoup

Oh, je devrais mentionner que je ne l'utilise pas pour la logique de gestion ou l'accès à la base de données. Les constantes sont un très bon pari pour une classe de base aussi, je suppose.


Answer #8

J'utilise maintenant un contrôleur de base pour l'internationalisation à l'aide de la bibliothèque i18N . Il fournit une méthode que je peux utiliser pour localiser les chaînes du contrôleur.







base-class