Questa domanda è stata probabilmente pubblicata prima, ma non riuscivo a trovarla.Dichiarazione dell'interfaccia o dello switch, ricerca del modello corretto
Ho scritto questo genere di cose per così tanto tempo, mi siedo per scrivere qualcosa di nuovo e inizio a digitare questo come se fosse il mio schema. Di recente è uscito un progetto e mi sono ritrovato a guardare il mio codice e ho iniziato a pensare a quanto fosse puzzolente.
BackgroundInfoIfYouCare
In questa particolare libreria ho bisogno di inviare e-mail agli utenti. Finora ci sono 13 e-mail in scatola.
Ogni e-mail ha il proprio modello (sto usando un parser Razor, quindi i modelli sono scritti in cshtml). Ogni modello di email ha un nome Chiave di stringa. Ogni e-mail ha la propria query EF4 per restituire un modello basato su un'entità "membership" e tutti i dati correlati.
Ho una classe che accetta una stringa che è una chiave nome modello di e-mail.
Il metodo eseguirà la query appropriata e recupererà un elenco, acquisendo il modello di email.
L'elenco e il modello vengono passati a un parser per unire ciascuna delle appartenenze al modello e restituisce un elenco di e-mail.
EndOfBackgroundInfoIfYouCare
Quindi la vera domanda ... qual è il modo migliore per farlo?
Un modo è quello di utilizzare solo un interruttore
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...
}
Un altro modo sarebbe quello di utilizzare un'interfaccia
IEmailQuery
void ExecuteQuery()
Ma se io uso un'interfaccia che sarà ancora bisogno di istanziare la classe Query. Non salva codice e non semplifica la manutenzione del codice.
Con riflessione avrei potuto fare qualcosa di simile a nome di tutte le query e-mail con un motivo: Email chiave modello di SecurityTraining ha un nome di query di SecurityTrainingEmailQuery e ho potuto utilizzare la reflection per creare un'istanza e chiamare il metodo ExecuteQuery.
Senza utilizzare la riflessione, non esiste un modo più pulito per collegarlo?
Beh, la risposta di Jon è simile, solo il modo più avanzato del mio temo ;-) – Lindan