为什么ManyConsole要显示CommandLine类的公共成员?

问题描述 投票:0回答:2

我在使用 多重奏 作为一个控制台应用程序的命令行命令和选项解析器。所有的命令都被定义为一个命令类,该类派生于 ConsoleCommand,然后实现一个具体的任务。我定义了一个中介基类。ParkPayConsoleCommand 派生自该类。

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是否将所有命令类的公共属性隐式地解释为命令选项?ManyConsole是否隐含地将所有命令类的公共属性解释为命令选项,即使它们没有被明确声明为命令选项?

c# command-line-interface console-application ndesk.options manyconsole
2个回答
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 公开和 ParkPayDbContext 受保护或私人。


0
投票

基本上是的,所有的公共属性都会像Greg说的那样被打印出来。 这并不意味着它们都被当作参数来处理(其实不然)。 一些附加点。

  • 如果你做了任何覆盖OverrideAfterHandlingArgumentsBeforeRun()的工作,并将结果分配给公共成员,那么当命令被打印到控制台时,这个结果就会显示出来。 这对于为用户记录一些中间结果是很有用的

  • 来格式化成员的打印方式,你可以在公共成员的类型上覆盖ToString。

我希望使用ManyConsole是顺利的,否则。

© www.soinside.com 2019 - 2024. All rights reserved.