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

时间:2013-04-28 13:35:07

标签: console-application command-line-interface ndesk.options manyconsole

我正在使用ManyConsole作为控制台应用程序的命令行命令和选项解析器。所有命令都定义为派生自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是否隐式将其命令类的所有公共属性解释为命令选项,即使它们没有明确声明为这样? / p>

2 个答案:

答案 0 :(得分: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保护或隐私可能会有用。

答案 1 :(得分:0)

基本上是的所有公共财产都是按照格雷格的说法打印出来的。这并不意味着它们都被视为参数(并且它们不是)。一些额外的要点:

  • 如果您执行任何覆盖OverrideAfterHandlingArgumentsBeforeRun()的工作并将结果分配给公共成员,则该结果将在命令打印到控制台时显示。这对于记录用户的一些中间结果非常有用

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

我希望使用ManyConsole是顺利的。