Clases de utilidad en MVC - ASP.NET

12

Así que me preguntaba hoy, ¿dónde ubicarías las clases de utilidad en una aplicación MVC de ASP.NET? Por clases de utilidad me refiero a las clases que pueden ser estáticas y solo se utilizan para realizar una función. Como una clase para enviar un correo electrónico que toma la dirección de correo electrónico, el asunto y el cuerpo como argumentos.
Supongo que tal vez crear una carpeta y un espacio de nombres por separado sería lo suficientemente bueno, pero quería obtener las opiniones de todos

    
pregunta user60812 10.09.2013 - 14:17

4 respuestas

10

No lo haces. Y su propio ejemplo es perfecto para mostrar por qué no.

¿Quieres enviar correos electrónicos, verdad? Así que creas en algún lugar una clase estática CommunicationUtilities con un SendEmail() estático en ella. Utiliza este método de alguna clase que hace un montón de cosas, por ejemplo, restablece la contraseña de un usuario y le envía una nueva por correo electrónico. Perfecto.

Ahora, ¿qué sucede si desea realizar una prueba de unidad de su clase? No puede, porque cada vez que desea probar el método que restablece la contraseña, cambia la base de datos (que no es adecuada para una prueba de unidad) y, además, envía un correo electrónico (que es aún peor).

Es posible que haya leído sobre Inversión de control, que tiene la ventaja de facilitar las pruebas unitarias. Los artículos sobre IoC te explicarán que, en lugar de hacer algo como:

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

que haces:

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

que permite usar simulacros y talones.

Intente aplicar IoC a su CommunicationUtilities . Bien, no puedes. Por eso está roto.

    
respondido por el Arseni Mourzenko 10.09.2013 - 14:30
7

La pregunta es válida, incluso si el ejemplo dado no lo es. La respuesta dada por Maina es perfecta, en un contexto muy específico, que no es, para mí, el contexto apropiado para dichas clases de "utilidad".

Personalmente, creo una carpeta "Ayudantes" en la que pongo funciones simples para llamar desde cualquier lugar, como extensiones, en cuyo caso, sí, son estáticas.

Ahora, si hay una mejor manera, estaré encantado de aprender, pero hasta ahora: -No veo nada malo con las extensiones. -No veo nada de malo en agruparlos en una carpeta específica.

Ahora, una extensión es solo azúcar sintáctica, también podría ser una función clásica.

    
respondido por el BernardG 02.11.2013 - 18:24
4

Ninguna de las respuestas proporcionadas anteriormente aborda la pregunta real. user60812 simplemente preguntó dónde se ubicaría una clase de utilidad dentro de un proyecto MVC. Todos escucharon el ejemplo singular y se quejaron de todo excepto de la pregunta en cuestión.

user60812, dependiendo del nivel de abstracción que desee, yo: A. crear una carpeta y crear la clase de utilidad dentro de esa carpeta B. crear un proyecto para mantener las clases de utilidad (asumiendo el deseo de reutilización del ensamblaje). C. extrapola tus utilidades en una arquitectura de servicio y llama a ellos

Aquí hay un enlace a una pregunta similar con mejores respuestas: enlace

IMHO

    
respondido por el Spencer Sullivan 15.03.2016 - 14:37
1

No cree clases estáticas para las utilidades. Las estadísticas son malas en la mayoría de los casos. No los llames gerentes tampoco. En lo que sea en lo que esté trabajando, debe colocarse en un espacio de nombres lógico.

Por ejemplo:

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

La dirección de correo electrónico, el asunto y el cuerpo es una preocupación aparte, por lo tanto, tendría una estructura de clase para eso, por lo tanto, he usado Email email en el ejemplo anterior.

    
respondido por el CodeART 10.09.2013 - 16:30

Lea otras preguntas en las etiquetas