Das Ziel dieser Bibliothek besteht darin, die Erstellung von Konsolen-App-Tools erheblich zu vereinfachen, indem sie Ihnen die Grundlagen der Benutzersteuerung vermittelt und Sie sich auf Ihren Geschäftswert konzentrieren können.
Dabei stehen Effizienz und Einfachheit im Vordergrund. Dies ist keine Bibliothek zum Zeichnen eines komplexen Dashboards in ASCII-Grafik.
[ Menu ( "This is a title" , Description = "This is an optional description" ) ]
public class MainMenu
{
[ Choice ( "This is the display text of the first choice" ) ]
public void Choice1 ( )
{
Console . WriteLine ( "Hello world !" ) ;
}
[ Choice ( "This is the display text of the second choice" ) ]
public void Choice2 ( )
{
Console . WriteLine ( "Goodbye world !" ) ;
}
}
using IHost host = Host . CreateDefaultBuilder ( args )
. ConfigureServices ( ( _ , services ) =>
{
services . AddMenuCLI < MainMenu > ( ) ;
} )
. Build ( ) ;
await host . Services . StartMenu ( ) ;
Sie können der App wie folgt ein Untermenü hinzufügen:
[ Menu ( "Submenu title" ) ]
public class SubMenu
{
[ Choice ( "This is the display text of the first choice" ) ]
public void Choice1 ( )
{
Console . WriteLine ( "Hello world !" ) ;
}
}
[ Choice ( "Sub Menu" , typeof ( SubMenu ) ) ]
public void Choice1 ( )
{
Console . WriteLine ( "Doing things..." ) ;
Thread . Sleep ( 1000 ) ;
}
Die App führt den Inhalt von Choice1 aus und leitet dann zu SubMenu weiter.
Die Bibliothek kann asynchrone Aufrufe wie folgt verarbeiten:
[ Choice ( "Async choice" ) ]
public async Task Choice2 ( )
{
Console . WriteLine ( "Doing async things..." ) ;
await Task . Delay ( 3000 ) ;
}
Mit der Bibliothek können Sie ein Untermenü basierend auf den Rückrufergebnissen konfigurieren:
[ Choice ( "Dynamic Menu" ) ]
public void Choice3 ( [ Menu ( "Dynamic Menu" , Description = "This is a generated menu from a callback" ) ] Menu menu )
{
var random = new Random ( ) ;
var choiceNumber = random . Next ( 9 ) ;
for ( int i = 0 ; i < choiceNumber + 1 ; i ++ )
{
menu . AddMenuChoice ( $ "Choice Id { Guid . NewGuid ( ) } " , ( ) => Console . WriteLine ( "What a choice !" ) ) ;
}
}
Die Abhängigkeitsinjektion funktioniert immer noch, aber möglicherweise nicht wie erwartet. Die Callback-Methode der Wahl wird im gleichen Kontext wie die Registerklasse ausgeführt. Schauen Sie sich das Sandbox-Beispiel genau an, um weitere Einzelheiten zu erfahren.
Alle Menüklassen werden durch Abhängigkeitsinjektion aufgelöst, sodass Sie sie auch verwenden können! (Ein detaillierteres Beispiel finden Sie im Sandbox-Projekt.)
Um Console.ReadKey()
zu überspringen und eine Benutzersequenz testen zu können, starten Sie das Menü mit dem optionalen Parameter wie in diesem Beispiel:
await host . Services . StartMenu ( true ) ;
Ein reales Beispiel für E2E-Tests können Sie im Tests
-Projekt sehen.
Weitere Arbeiten sind geplant, wie eine komplexere Umleitung des Untermenüs abhängig von der Rückrufrückgabe, die Handhabung des Fortschrittsbalkens und das verzögerte Laden der Menüklassen (im Moment werden sie eifrig am Bootstrap der App geladen).