我正在从事一个项目,需要非常可扩展。它是关于基于字符串代码或枚举值执行操作。我现在使用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"),这样我就可以避免使用切换用例,只执行一次调用。
我需要它是非常动态的,并且在另一个库中,所以我想知道对于这类问题是否有一个最佳实践或一个很好的设计模式。
发布于 2013-05-16 20:33:06
您可以从创建字典开始:
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-16 20:16:54
如果您能够设法统一您的操作调用模式,则可以向您的基本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;
}https://stackoverflow.com/questions/16586469
复制相似问题