Probablemente esta pregunta se haya publicado anteriormente, pero no pude encontrarla.Declaración de interfaz o interruptor, encontrar el patrón correcto
He estado escribiendo este tipo de cosas durante tanto tiempo, me siento a escribir algo nuevo y simplemente empiezo a escribir esto como si fuera mi propio patrón. Hace poco surgió un proyecto y me encontré mirando mi propio código y comencé a pensar en lo mal que se ve.
BackgroundInfoIfYouCare
En esta biblioteca en particular tengo que enviar correos electrónicos a los usuarios. Hasta ahora hay 13 correos electrónicos enlatados.
Cada correo electrónico tiene su propia plantilla (estoy usando un analizador Razor, por lo que las plantillas están escritas en cshtml). Cada plantilla de correo electrónico tiene una clave de nombre de cadena. Cada correo electrónico tiene su propia consulta EF4 para devolver un modelo basado en una entidad de "membresía" y todos los datos relacionados.
Tengo una clase que acepta una cadena que es una clave de nombre de plantilla de correo electrónico.
El método ejecutará la consulta adecuada y obtendrá una lista de regreso, agarra la plantilla de correo electrónico.
La lista y la plantilla se pasan a un analizador para fusionar cada una de las membresías a la plantilla y devuelve una lista de correos electrónicos.
EndOfBackgroundInfoIfYouCare
Entonces la verdadera pregunta ... ¿cuál es la mejor manera de hacer esto?
Una forma es utilizar sólo un interruptor de
public List<Membership> Execute(string TemplateKey) {
switch (TemplateKey)
{
case "SomethingExpired":
QueryResult = new SomethingExpiredEmailQuery().ExecuteQuery();
break;
case "SomethingExpireIn30":
QueryResult = new SomethingExpireIn30EmailQuery().ExecuteQuery();
break;
case "FirstTimeLoginThanks":
QueryResult = new FirstTimeLoginThanksEmailQuery().ExecuteQuery();
break;
case "SecurityTraining":
QueryResult = new SecurityTrainingEmailQuery().ExecuteQuery();
break;
case ETC ETC ETC...
}
Otra manera sería utilizar una interfaz
IEmailQuery
void ExecuteQuery()
Pero si uso una interfaz todavía necesitarán crear una instancia de la clase Query. No guarda código y no hace que el código sea más fácil de mantener.
Con la reflexión que podía hacer algo así como el nombre de todas las consultas de correo electrónico con un patrón: Plantilla Email Clave de SecurityTraining tiene un nombre de consulta de SecurityTrainingEmailQuery y pude utilizar para crear instancias de reflexión y llame al método ExecuteQuery.
Sin usar reflexión, ¿no hay una manera más limpia de cablear esto?
Bueno, la respuesta de Jon es similar, solo que mucho más avanzada que la mía, me temo ;-) – Lindan