繁体   English   中英

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

[英]Extendable design pattern based on database records or enum values

我正在开发一个需要非常可扩展的项目。 它是基于字符串代码或枚举值执行操作。 我现在使用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();

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM