Tujuan perpustakaan ini adalah untuk menyederhanakan pembuatan alat aplikasi konsol, dengan menangani dasar-dasar kontrol pengguna, dan memungkinkan Anda fokus pada nilai bisnis Anda.
Fokusnya di sini adalah efisiensi dan kesederhanaan. Ini bukanlah perpustakaan untuk menggambar dasbor rumit dalam seni 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 ( ) ;
Anda dapat menambahkan submenu ke aplikasi seperti ini:
[ 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 ) ;
}
Aplikasi akan menjalankan konten Choice1 lalu mengarahkan ke SubMenu.
Perpustakaan dapat menangani panggilan async seperti ini:
[ Choice ( "Async choice" ) ]
public async Task Choice2 ( )
{
Console . WriteLine ( "Doing async things..." ) ;
await Task . Delay ( 3000 ) ;
}
Pustaka memungkinkan Anda mengonfigurasi submenu berdasarkan hasil panggilan balik:
[ 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 !" ) ) ;
}
}
Injeksi ketergantungan masih berfungsi, tapi mungkin tidak seperti yang diharapkan. Metode panggilan balik pilihan dijalankan dalam konteks yang sama dengan kelas register. Perhatikan baik-baik contoh sandbox agar lebih presisi.
Semua kelas menu diselesaikan dengan injeksi ketergantungan, sehingga Anda dapat menggunakannya juga! (lihat proyek sandbox untuk contoh lebih detail)
Untuk melewati Console.ReadKey()
dan dapat menguji urutan pengguna, mulai menu dengan parameter opsional seperti dalam contoh ini:
await host . Services . StartMenu ( true ) ;
Anda dapat melihat contoh nyata pengujian E2E di proyek Tests
.
Lebih banyak pekerjaan direncanakan seperti pengalihan submenu yang lebih kompleks tergantung pada pengembalian panggilan balik, penanganan bilah kemajuan, dan pemuatan kelas menu yang lambat (saat ini kelas-kelas tersebut dimuat dengan penuh semangat di bootstrap aplikasi).