Шаблон C # для абстрактного кода, специфичного для класса - PullRequest
6 голосов
/ 24 июня 2011

У меня есть абстрактный класс «Action», который имеет производные типы ActionAppointment, ActionCall, ActionEmail и ActionLetter.Я пытаюсь написать функцию, которая будет СУШИТЬ наш сервисный уровень, поэтому мы больше не пишем CRUD-вызовы 5 раз.

У меня на сервисном уровне есть некоторая логика обновления (много другого кода удалено длякраткость):

private IServiceResponse UpdateAction<T>(T action, string originalActionStatus) where T : Action
{
        if (action.GetType() == typeof(Action))
        {
            _actionRepository.Update(action);
        }
        else if (action.GetType() == typeof(ActionAppointment))
        {
            _actionAppointmentRepository.Update(action as ActionAppointment);
        }
        else if (action.GetType() == typeof(ActionCall))
        {
            _actionCallRepository.Update(action as ActionCall);
        }
        else if (action.GetType() == typeof(ActionEmail))
        {
            _actionEmailRepository.Update(action as ActionEmail);
        }
        else if (action.GetType() == typeof(ActionLetter))
        {
            _actionLetterRepository.Update(action as ActionLetter);
        }
}

К сожалению, как настроены наши репозитории, я должен использовать специально названные репозитории (т. е. я не могу обновить ActionLetter через _actionRepository, даже если он является производным от Action)

Я читал на разных шаблонах, и это звучит как что-то похожее на Factory Pattern, но я не понимаю, как заставить его работать.

Я что-то упустил из глупости?

Ответы [ 2 ]

11 голосов
/ 24 июня 2011

Разве вы не можете просто написать перегрузку этого метода для каждого типа действия?Забудьте о вещах <T> и typeof - то, что вы делаете, это реализует встроенную функцию языка (перегрузка методов) вручную, и хрупким способом тоже.

0 голосов
/ 24 июня 2011

Давайте изменим логику здесь:

abstract class Action {
    protected abstract Repository GetRepository();
    protected void Update(){
       this.GetRepository().Update(this);
    }
}

Все, что вам нужно сделать, это переопределить GetRepository в каждом из производных классов.Например:

class ActionAppointment : Action {
    protected override Repository GetRepository() {
        return _actionAppointmentRepository;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...