El objetivo de esta biblioteca es simplificar enormemente la creación de herramientas de aplicaciones de consola, manejando por usted los conceptos básicos del control del usuario y permitiéndole concentrarse en el valor de su negocio.
El foco aquí es la eficiencia y la simplicidad. Esta no es una biblioteca para dibujar un tablero complejo en arte 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 ( ) ;
Puede agregar un submenú a la aplicación de esta manera:
[ 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 ) ;
}
La aplicación ejecutará el contenido de Choice1 y luego lo redireccionará al SubMenú.
La biblioteca puede manejar llamadas asíncronas como esta:
[ Choice ( "Async choice" ) ]
public async Task Choice2 ( )
{
Console . WriteLine ( "Doing async things..." ) ;
await Task . Delay ( 3000 ) ;
}
La biblioteca puede permitirle configurar un submenú basado en los resultados de la devolución de llamada:
[ 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 !" ) ) ;
}
}
La inyección de dependencia todavía funciona, pero tal vez no como se esperaba. El método de devolución de llamada de la elección se ejecuta en el mismo contexto que la clase de registro. Mire de cerca el ejemplo de la zona de pruebas para obtener más precisiones.
Todas las clases del menú se resuelven mediante inyección de dependencia, ¡así que tú también puedes usarlas! (consulte el proyecto sandbox para obtener un ejemplo más detallado)
Para omitir Console.ReadKey()
y poder probar una secuencia de usuario, inicie el menú con el parámetro opcional como en este ejemplo:
await host . Services . StartMenu ( true ) ;
Puedes ver un ejemplo real de pruebas E2E en el proyecto Tests
.
Se planea más trabajo, como una redirección de submenú más compleja dependiendo de la devolución de llamada, el manejo de la barra de progreso y la carga diferida de las clases del menú (en este momento se cargan con entusiasmo en el arranque de la aplicación).