首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于数据库记录或枚举值的可扩展设计模式

基于数据库记录或枚举值的可扩展设计模式
EN

Stack Overflow用户
提问于 2013-05-16 19:41:29
回答 2查看 346关注 0票数 1

我正在从事一个项目,需要非常可扩展。它是关于基于字符串代码或枚举值执行操作。我现在使用switch-case语句并手动调用这些方法。

我想要做的是遍历数据库记录(并最终获得枚举值或字符串代码),调用"PerformAction“方法,并使其能够在以后实现类或方法。

代码语言:javascript
复制
    public bool PerformAction(ActionToPerform actionToPerform)
    {
        bool isPerformed = false;

        switch (actionToPerform.Action.Code)
        {
            case "MAIL":
                isPerformed = Actions.SendEmail(actionToPerform);
                break;
            case "RESTART":
                isPerformed = Actions.RestartSendport();
                break;
            case "EVENT-LOG":
                isPerformed = Actions.AddToEventLog();
                break;
        }
        //Do some more
        return isPerformed;
}

我希望以后能够实现像SendEmail、RestartSendport和AddToEventLog这样的操作。我知道这可以通过使用反射并为方法指定代码名称(例如"MAIL.cs"),这样我就可以避免使用切换用例,只执行一次调用。

我需要它是非常动态的,并且在另一个库中,所以我想知道对于这类问题是否有一个最佳实践或一个很好的设计模式。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-16 20:33:06

您可以从创建字典开始:

代码语言:javascript
复制
private Dictionary<ActionType, ActionBase> actions;

所以你可以这样做,而不是switch (currentActionType)

代码语言:javascript
复制
if (actions.ContainsKey(currentActionType))
    actions[currentActionType].Run(someArgs);

这样,您就可以将操作映射与操作调用分开。映射可以在构造函数中完成:

代码语言:javascript
复制
actions[ActionType.SendEmail] = new SendEmailAction();
actions[ActionType.OtherAction] = new OtherAction();

之后,您可以将操作字典提取到单独的ActionsRepository中,并将其作为依赖项注入。存储库可以有一个用于在运行时创建映射的方法RegisterAction(ActionType type, ActionBase action)

票数 4
EN

Stack Overflow用户

发布于 2013-05-16 20:16:54

如果您能够设法统一您的操作调用模式,则可以向您的基本action类添加一些ID字段,并以这种方式调用它:

代码语言:javascript
复制
public bool PerformAction(ActionToPerform actionToPerform)
{
    bool isPerformed = false;
    var foundAction = Actions.SingleOrDefault(a => a.Code == actionToPerform.Action.Code);
    if (foundAction != null)
    {
        isPerformed = foundAction.Invoke();
    }

    //Do some more
    return isPerformed;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16586469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档