L'objectif de cette bibliothèque est de simplifier considérablement la création d'outils d'application console, en gérant pour vous les bases du contrôle utilisateur, et en vous permettant de vous concentrer sur votre valeur commerciale.
L’accent ici est mis sur l’efficacité et la simplicité. Ce n'est pas une bibliothèque pour dessiner un tableau de bord complexe en art ASCII.
[ 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 ( ) ;
Vous pouvez ajouter un sous-menu à l'application comme ceci :
[ 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 ) ;
}
L'application exécutera le contenu de Choice1 puis redirigera vers le sous-menu.
La bibliothèque peut gérer les appels asynchrones comme ceci :
[ Choice ( "Async choice" ) ]
public async Task Choice2 ( )
{
Console . WriteLine ( "Doing async things..." ) ;
await Task . Delay ( 3000 ) ;
}
La bibliothèque peut vous permettre de configurer un sous-menu basé sur les résultats du rappel :
[ 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 !" ) ) ;
}
}
L'injection de dépendances fonctionne toujours, mais peut-être pas comme prévu. La méthode de rappel du choix est exécutée dans le même contexte que la classe de registre. Regardez attentivement l'exemple du bac à sable pour plus de précisions.
Toutes les classes de menu sont résolues par injection de dépendances, vous pouvez donc l'utiliser aussi ! (voir le projet sandbox pour un exemple plus détaillé)
Pour sauter le Console.ReadKey()
et pouvoir tester une séquence utilisateur, démarrez le menu avec le paramètre facultatif comme dans cet exemple :
await host . Services . StartMenu ( true ) ;
Vous pouvez voir un exemple réel de tests E2E dans le projet Tests
.
D'autres travaux sont prévus, comme une redirection de sous-menu plus complexe en fonction du retour de rappel, de la gestion de la barre de progression et du chargement paresseux des classes de menu (pour le moment, elles sont chargées avec impatience au démarrage de l'application).