我在 .NET6 中有一个控制台应用程序,它接收 1 个参数,并基于此来决定将执行哪个操作。起初,我将所有执行都作为静态方法,并且所有内容都在 switch 语句中决定,但随后重构了操作执行。
但现在我仍在尝试找出如何删除 switch 语句,以便让一切变得更加动态,并且不用担心每次开发新操作时添加新案例。
基本上试图达成一个解决方案(至少是一个“好的”方法),开发人员应该只担心操作类本身的编码,而不是去切换(程序应该知道什么与什么相关 -> 参数-行动)
目前主要代码如下:
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
//validating args
if(!args.Any())
return;
switch (args.First())
{
case "action1":
case "action2":
case "action3":
break;
default:
return;
}
switch (args.First())
{
case "action1":
RunTheAction<Action1>();
break;
case "action2":
RunTheAction<Action2>();
break;
case "action3":
//todo RunTheAction<Action3>()
break;
//it keeps growing -> RunTheAction<>()
}
}
static void RunTheAction<T>() where T : IAction
{
var action = Activator.CreateInstance<T>();
action.Execute();
}
}
}
所有要执行的action实例都使用IAction接口:
internal interface IAction
{
void Execute();
}
internal class Action1 : IAction
{
public void Execute()
{
//do some action1 stuff
}
}
internal class Action2 : IAction
{
public void Execute()
{
//do some action2 stuff (different than action1 :) )
}
}
与动作的恒定字符串关系
不要重新发明轮子。 CommandlineUtils 是一个很棒的库,可以做你想要的事情,并且有大量的文档。它允许您定义命令层次结构并处理解析参数,以便您可以根据需要将数据传递给各个命令。与依赖项注入和日志记录配合使用,以便您可以构建专业的控制台应用程序。