Classes utilitaires dans MVC - ASP.NET

16

Je me demandais donc aujourd'hui, où mettriez-vous des classes utilitaires dans une application ASP.NET MVC? Par classes utilitaires, j'entends des classes qui peuvent être statiques et qui sont juste utilisées pour exécuter une fonction. Comme une classe pour envoyer un e-mail qui prend comme argument l'adresse e-mail, l'objet et le corps.
Je suppose que la création d'un dossier et d'un espace de noms séparés serait peut-être suffisant, mais je voulais obtenir l'avis de tout le monde

user60812
la source
3
Pourquoi créer des classes utilitaires dans n'importe quel type de projet? Pourquoi MVC est-il mentionné dans votre question?
Odé le
2
Eh bien, je me posais des questions sur MVC parce qu'il force en quelque sorte la structure. Et en ce qui concerne l'utilitaire, j'avais l'impression que tout le monde les utilisait :) Si j'ai un code d'expéditeur d'e-mail, et que je le divise en une classe distincte pour travailler avec différentes parties du système, n'est-ce pas une classe utilitaire ou suis-je J'ai confondu? Je pensais que les classes utilitaires étaient autrefois réutilisables dans n'importe quel programme qui n'était pas lié au code
user60812
Je considérerais personnellement l'envoi d'un service par e-mail, résumé par exemple l'interface IUserNotificationSender ou autre .. avec une gestion des erreurs appropriée, une configuration smtp, etc. qui ne rentre pas vraiment dans une fonction utilitaire ...
Max
@Max alors qu'est-ce qui serait considéré comme une fonction utilitaire? J'essaie de comprendre, car il me semble que je suis très confus
user60812
Eh bien, une fonction utilitaire appropriée dans mon esprit est une très petite fonction avec une portée très définie et sans dépendances externes ... Comme une fonction pour supprimer les espaces blancs, ou couper une chaîne, ou obtenir le nième élément d'une collection ...
Max

Réponses:

11

Non. Et votre propre exemple est parfait pour montrer pourquoi.

Vous voulez envoyer des e-mails, non? Vous créez donc quelque part une classe statique CommunicationUtilitiesavec une statique SendEmail(). Vous utilisez cette méthode d'une classe qui fait un tas de choses, par exemple réinitialise le mot de passe d'un utilisateur et lui envoie un nouveau par e-mail. Parfait.

Maintenant, que se passe-t-il si vous voulez faire un test unitaire de votre classe? Vous ne pouvez pas, car chaque fois que vous voulez tester la méthode qui réinitialise le mot de passe, cela change la base de données (qui ne convient pas pour un test unitaire), et envoie en outre un e-mail (ce qui est encore pire).

Vous avez peut-être lu sur Inversion of Control, qui a l'avantage de faciliter les tests unitaires. Des articles sur l'IoC vous expliqueront qu'au lieu de faire quelque chose comme:

void ResetPassword(UserIdentifier userId)
{
    ...
    new MailSender().SendPasswordReset(userMail, newPassword);
}

tu fais:

void ResetPassword(IMailSender sender, UserIdentifier userId)
{
    ...
    sender.SendPasswordReset(userMail, newPassword);
}

ce qui permet d'utiliser des moquettes et des talons.

Essayez d'appliquer l'IoC à votre CommunicationUtilities. Bon, tu ne peux pas. Voilà pourquoi il est cassé.

Arseni Mourzenko
la source
Salut MainMa, donc si je comprends bien, il est toujours approprié de faire une classe d'arrière-plan avec tous les tuyaux, puis de l'abstraire avec une interface, et de passer l'interface à la fonction au lieu d'appeler directement de la classe comme dans votre premier extrait.
user60812
1
@ user60812: en bref, découvrez IoC. Il serait difficile d'expliquer l'ensemble du sujet dans un simple commentaire.
Arseni Mourzenko
1
Qu'en est-il d'une fonction utilitaire vraiment générique, comme un troncateur de chaînes?
2015
2
@MainMa - désolé, je ne suis pas. C'est dans la ligne de ce que je veux, oui. Mais Truncate () n'est pas intégré dans c #, donc je me demandais s'il serait logique de coller ce type de fonction utilitaire générique dans une sorte de classe d'utilitaires.
2015
2
Cette réponse définit le problème en notant que dans ce cas particulier aucune classe util n'est nécessaire. Mais en général, il existe toujours des méthodes de style "d'aide" qui ne conviennent nulle part.
usr
9

La question est valable, même si l'exemple donné ne l'est pas. La réponse donnée par Maina est parfaite, dans un contexte très spécifique, qui n'est pas pour moi, le bon contexte pour lesdites classes "utilitaires" .

Personnellement, je crée un dossier Helpersdans lequel je mets des fonctions simples à appeler de n'importe où, comme des extensions, auquel cas, oui, elles sont statiques.

Maintenant, s'il y a une meilleure façon, je serai heureux d'apprendre, mais jusqu'à présent:

  • Je ne vois rien de mal avec les extensions.
  • Je ne vois rien de mal à les regrouper dans un dossier spécifique.

Maintenant, une extension est juste du sucre syntaxique, elle pourrait aussi bien être une fonction classique.

BernardG
la source
6

Aucune des réponses précédemment fournies ne répond à la question réelle. user60812 a simplement demandé où placer une classe utilitaire à l'intérieur d'un projet MVC. Tout le monde a écouté l'exemple singulier et a déclamé tout sauf la question à portée de main.

@ user60812, selon le niveau d'abstraction souhaité, je:

  • A) Créez un dossier et créez la classe utilitaire dans ce dossier
  • B) Créer un projet pour contenir les classes d'utilité (en supposant le désir de réutilisation de l'assemblage).
  • C) Extrapolez vos utilitaires dans une architecture de service et appelez-les

Voici un lien vers une question similaire avec de meilleures réponses.

A mon humble avis

Spencer Sullivan
la source
1

Ne créez pas de classes statiques pour les utilitaires. La statique est mauvaise dans la plupart des cas. Ne les appelez pas non plus managers. Quoi que vous travailliez, il doit être placé dans un espace de noms logique.

Par exemple:

namespace Application.Notifications.Email
{
   public interface ISendEmailCommand
   {
      void Execute(Email email);
   }
}

L'adresse e-mail, le sujet et le corps sont une préoccupation distincte, donc j'aurais une structure de classe pour cela, d'où la raison pour laquelle j'ai utilisé l' Email emailexemple ci-dessus.

CodeART
la source
Veuillez expliquer pourquoi les classes statiques ne conviennent pas aux méthodes utilitaires? Je suis vraiment curieux de connaître votre raisonnement.
Spencer Sullivan