C#Pattern用于抽象类特定代码

时间:2011-06-23 20:05:15

标签: c# design-patterns repository-pattern

我有一个抽象的“Action”类,它派生了ActionAppointment,ActionCall,ActionEmail和ActionLetter的类型。我正在尝试编写一个会干掉我们服务层的函数,所以我们不再编写5次CRUD调用了。

我在服务层中有一些更新逻辑(为简洁起见,删除了许多其他代码):

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);
        }
}

不幸的是,我们的存储库是如何设置的,我必须使用专门命名的存储库(即,我无法通过_actionRepository更新ActionLetter,即使它派生自Action)

我一直在阅读不同的模式,它听起来像一个类似于工厂模式的东西,但我看不出如何让它工作。

我错过了一些愚蠢的东西吗?

2 个答案:

答案 0 :(得分:11)

难道你不能为每种动作类型写一个重载方法吗?忘记<T>typeof内容 - 您正在做的是手动实现内置语言功能(方法重载),并且也是一种脆弱的方式。

答案 1 :(得分:-2)

让我们在这里颠倒逻辑:

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

您所要做的就是覆盖每个派生类中的GetRepository。例如:

class ActionAppointment : Action {
    protected override Repository GetRepository() {
        return _actionAppointmentRepository;
    }
}