Интерфейс или оператор переключения, поиск правильного шаблона

Этот вопрос, вероятно, уже публиковался раньше, но я не мог найти Это.

Я писал такие вещи так долго, что сажусь, чтобы написать что-то новое, и просто начинаю набирать это, как если бы это был мой собственный образец. Недавно появился проект, и я обнаружил, что смотрю на свой собственный код и начинаю думать, как неприятно он выглядит.

 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.

Нет ли более чистого способа подключить это без отражения?

5
задан Christofer Eliasson 21 December 2011 в 13:56
поделиться