我正在从事一个需要非常可扩展的项目。它是关于根据字符串代码或枚举值执行操作。我现在使用 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/