Этот вопрос, возможно, был опубликован ранее, но я не смог его найти.
Я так долго пишу такие вещи, я сажусь, чтобы написать что-то новое, и просто начинаю печатать это, как будто это был мой собственный шаблон.Недавно появился проект, и я обнаружил, что смотрю на свой собственный код, и начал думать, как он вонючий.
BackgroundInfoIfYouCare
В этой конкретной библиотеке мне нужно отсылать электронные письма пользователям.На данный момент есть 13 консервированных писем.
Каждое письмо имеет свой собственный шаблон (я использую анализатор Razor, поэтому шаблоны написаны на cshtml).Каждый шаблон электронной почты имеет имя ключа строки.Каждое письмо имеет свой собственный запрос EF4 для возврата модели, основанной на сущности «членство» и всех связанных данных.
У меня есть класс, который принимает строку, которая является ключом имени шаблона электронной почты.
Метод запускает соответствующий запрос и возвращает список, получает шаблон электронной почты.
Список и шаблон передаются анализатору для объединения каждого членства в шаблон и возврата.список писем.
EndOfBackgroundInfoIfYouCare
Итак, реальный вопрос ... как лучше всего это сделать?
Один из способов - просто использовать переключатель
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...
}
Другим способом было бы использование интерфейса
IEmailQuery
void ExecuteQuery()
Но если я использую интерфейс, мне все равно потребуется создать экземпляр класса Query.Он не экономит код и не облегчает его обслуживание.
С учетом этого я мог бы сделать что-то вроде имени всех запросов электронной почты с помощью шаблона: Ключ шаблона электронной почты SecurityTraining имеет имя запроса SecurityTrainingEmailQuery, и яможет использовать отражение для создания экземпляра и вызова метода ExecuteQuery.
Без размышления, нет ли более чистого способа подключения?