1

我正在开发一个需要非常可扩展的项目。它是关于基于字符串代码或枚举值执行操作。我现在正在使用 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 等操作。我知道这可以以某种方式使用反射来完成,并为方法提供代码的名称(例如“MAIL.cs”),这样我就可以避免使用开关盒并执行一次调用。

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

4

2 回答 2

4

您可以从创建字典开始:

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

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

于 2013-05-16T12:33:05.717 回答
0

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

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;
}
于 2013-05-16T12:16:54.223 回答