Ich bin kürzlich auf die FubuCore-Befehlszeilen-Parsing-Implementierung gestoßen, die mir sehr gut gefällt. Die Gründe dafür sind:
- Es ist einfach zu bedienen - obwohl ich keine Dokumentation dafür finden konnte, bietet die FubuCore-Lösung auch ein Projekt mit einer Reihe von Unit-Tests, die mehr über die Funktionalität sprechen als jede Dokumentation
- Es hat ein schönes objektorientiertes Design, keine Code-Wiederholung oder andere solche Dinge, die ich früher in meinen Befehlszeilen-Parsing-Apps hatte
- Es ist deklarativ: Sie schreiben grundsätzlich Klassen für die Befehle und Parametersätze und dekorieren sie mit Attributen, um verschiedene Optionen festzulegen (z. B. Name, Beschreibung, obligatorisch / optional).
- Die Bibliothek druckt sogar ein schönes Nutzungsdiagramm, das auf diesen Definitionen basiert
Unten finden Sie ein einfaches Beispiel für die Verwendung. Um die Verwendung zu veranschaulichen, habe ich ein einfaches Dienstprogramm geschrieben, das zwei Befehle enthält: - add (fügt einer Liste ein Objekt hinzu - ein Objekt besteht aus einem Namen (Zeichenfolge), einem Wert (int) und einem booleschen Flag) - list (Listen) alle aktuell hinzugefügten Objekte)
Zuerst habe ich eine Befehlsklasse für den Befehl 'add' geschrieben:
[Usage("add", "Adds an object to the list")]
[CommandDescription("Add object", Name = "add")]
public class AddCommand : FubuCommand<CommandInput>
{
public override bool Execute(CommandInput input)
{
State.Objects.Add(input); // add the new object to an in-memory collection
return true;
}
}
Dieser Befehl verwendet eine CommandInput-Instanz als Parameter, daher definiere ich Folgendes:
public class CommandInput
{
[RequiredUsage("add"), Description("The name of the object to add")]
public string ObjectName { get; set; }
[ValidUsage("add")]
[Description("The value of the object to add")]
public int ObjectValue { get; set; }
[Description("Multiply the value by -1")]
[ValidUsage("add")]
[FlagAlias("nv")]
public bool NegateValueFlag { get; set; }
}
Der nächste Befehl ist 'list', der wie folgt implementiert wird:
[Usage("list", "List the objects we have so far")]
[CommandDescription("List objects", Name = "list")]
public class ListCommand : FubuCommand<NullInput>
{
public override bool Execute(NullInput input)
{
State.Objects.ForEach(Console.WriteLine);
return false;
}
}
Der Befehl 'list' akzeptiert keine Parameter, daher habe ich eine NullInput-Klasse dafür definiert:
public class NullInput { }
Jetzt müssen Sie nur noch die Main () -Methode wie folgt verkabeln:
static void Main(string[] args)
{
var factory = new CommandFactory();
factory.RegisterCommands(typeof(Program).Assembly);
var executor = new CommandExecutor(factory);
executor.Execute(args);
}
Das Programm funktioniert wie erwartet und druckt Hinweise zur korrekten Verwendung, falls Befehle ungültig sind:
------------------------
Available commands:
------------------------
add -> Add object
list -> List objects
------------------------
Und eine Beispielverwendung für den Befehl 'add':
Usages for 'add' (Add object)
add <objectname> [-nv]
-------------------------------------------------
Arguments
-------------------------------------------------
objectname -> The name of the object to add
objectvalue -> The value of the object to add
-------------------------------------------------
-------------------------------------
Flags
-------------------------------------
[-nv] -> Multiply the value by -1
-------------------------------------