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

标签 c# design-patterns switch-statement

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

我想做的是循环遍历数据库记录(并最终获得枚举值或字符串代码),调用方法“PerformAction”并使稍后实现类或方法成为可能。

    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 等操作。我知道这可以通过反射以某种方式完成,并为方法提供 CODE 的名称(例如“MAIL.cs”),这样我就可以避免使用 switch case 并执行一次调用。

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

最佳答案

您可以从创建字典开始:

private Dictionary<ActionType, ActionBase> actions;

因此,您可以这样代替 switch (currentActionType):

if (actions.ContainsKey(currentActionType))
    actions[currentActionType].Run(someArgs);

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

actions[ActionType.SendEmail] = new SendEmailAction();
actions[ActionType.OtherAction] = new OtherAction();

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

关于c# - 基于数据库记录或枚举值的可扩展设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16586469/

相关文章:

c# - SqlConnection 构造函数中无法识别的转义序列

php - 重构返回不同数据类型的函数

c# - AleaGPU C# 中的高阶函数

c - 打印所有 switch 语句

javascript - JavaScript 中的 if 语句与 switch 语句

c# - 使用 C# 填充 bootstrap 下拉列表

c# - System.Data.SQLite BackupDatabase() 抛出 "not an error"

java - 具有不同表达式类型的嵌套开关

c# - 获取表的架构

java - 购物车的OO设计模式