0

我使用ManyConsole作为控制台应用程序的命令行命令和选项解析器。所有命令都定义为从ConsoleCommand派生的命令类,然后执行特定的任务。我定义了一个中介的基类,ParkPayConsoleCommand从该类派生的:为什么ManyConsole显示一个CommandLine类的公共成员?

abstract class ParkPayConsoleCommand: ConsoleCommand 
{ 
    protected readonly ParkPayDbContext DbContext = new ParkPayDbContext(); 
} 

然后我所有的命令类从我的基类派生,并享受内置DbContext,如:

class ReadStartsCommand : ParkPayConsoleCommand 
{ 
    public ReadStartsCommand() 
    { 
     _commandTrace = new TraceSource(CommandName, SourceLevels.All); 
     IsCommand("read-starts", "Processes imported vehicle entry movements to create new VehiclePresence records with start date-times based on those movements"); 
     HasRequiredOption("b|batchId:", "The Id of the VehicleMovementBatch used to create new vehicle presences.", b => _batchIdOption = b); 
    } 

    public override int Run(string[] remainingArguments) 
    { 
     // Do the business of the command. 
     return (int)ExitCodes.Success; 
    } 
} 

这是一个ManyConsole约定为每个命令类命名和描述自己,并在其构造函数中定义其命令行选项,如上所示。正常情况下,当我运行上面的命令(如ReadStartsCommand)时,它只是写入控制台正在运行的命令,而不是我传递的选项。

然而,当我做ParkPayConsoleCommand.DbContext公开,没有保护,

的DbContext输出字符串:ParkPay.Model.Context.ParkPayDbContext

到控制台在运行命令的名称结束和说明。为什么当DbContext没有被任何地方定义为命令选项本身时,它会这样做。这可能看起来微不足道,但本质上我提出了一个非常重要的'元问题',那就是:ManyConsole是否隐式地将其命令类的所有公共属性解释为命令选项,即使它们没有被明确声明为这样?

回答

0

我不能说最初的意图,但正如你发现的,是的,它似乎是这样做的。为什么这可能是有用的建议:

有时命令行选项不会将1对1映射到ConsoleCommand类的属性。考虑

public class VerbosityCommand : ConsoleCommand 
{ 
    public int VerbosityLevel {get;set;} 

    public VerbosityCommand(){ 
     this.IsCommand("Verbosity","Control the level of verbosity"); 
     this.HasOption("v|verbose","Increase verbosity, cumulative",x => Verbosity++); 
    } 
} 

现在,通过ManyConsole打印的块将(有益)具有VerbosityLevel : 3(例如),而不是(无助地)具有

Verbose : set 
Verbose : set 
Verbose : set 

或类似的东西。

另一个示例是预设类型标志,它将许多属性配置为通用配置。

对你而言,制作_batchIdOption public或ParkPayDbContext可能是有用的保护或私人。

0

基本上是所有的公共财产打印格雷格说。这并不意味着它们都被视为论据(而不是)。一些附加分:

  • ,如果你做任何工作覆盖OverrideAfterHandlingArgumentsBeforeRun(),然后将结果向公众成员,该结果将显示,当命令被打印到控制台。这可以是记录一些中间结果供用户

  • 格式化成员的打印方式有用,可以对公众成员的类型

覆盖的ToString我希望用ManyConsole光滑,否则。