วัตถุประสงค์ของไลบรารีนี้คือเพื่อทำให้การสร้างเครื่องมือแอปคอนโซลง่ายขึ้นอย่างมาก โดยจัดการพื้นฐานการควบคุมผู้ใช้ให้กับคุณ และให้คุณมุ่งเน้นไปที่มูลค่าทางธุรกิจของคุณ
จุดเน้นที่นี่คือประสิทธิภาพและความเรียบง่าย นี่ไม่ใช่ไลบรารีสำหรับวาดแดชบอร์ดที่ซับซ้อนในรูปแบบ 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 ( ) ;
คุณสามารถเพิ่มเมนูย่อยให้กับแอปได้ดังนี้:
[ 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 ) ;
}
แอปจะดำเนินการเนื้อหาของ Choice1 จากนั้นเปลี่ยนเส้นทางไปยังเมนูย่อย
ไลบรารีสามารถจัดการการโทรแบบ async ได้ดังนี้:
[ Choice ( "Async choice" ) ]
public async Task Choice2 ( )
{
Console . WriteLine ( "Doing async things..." ) ;
await Task . Delay ( 3000 ) ;
}
ไลบรารีสามารถให้คุณกำหนดค่าเมนูย่อยตามผลลัพธ์การโทรกลับ:
[ 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 !" ) ) ;
}
}
การพึ่งพาการฉีดยังคงใช้งานได้ แต่อาจไม่เป็นไปตามที่คาดไว้ วิธีการโทรกลับของตัวเลือกจะดำเนินการในบริบทเดียวกับคลาสรีจิสเตอร์ ดูตัวอย่างแซนด์บ็อกซ์อย่างใกล้ชิดเพื่อความแม่นยำที่มากขึ้น
คลาสเมนูทั้งหมดได้รับการแก้ไขโดยการฉีดการขึ้นต่อกัน ดังนั้นคุณก็สามารถนำไปใช้ได้เช่นกัน! (ดูโครงการแซนด์บ็อกซ์สำหรับตัวอย่างโดยละเอียดเพิ่มเติม)
หากต้องการข้าม Console.ReadKey()
และสามารถทดสอบลำดับผู้ใช้ได้ ให้เริ่มเมนูด้วยพารามิเตอร์เผื่อเลือกดังในตัวอย่างนี้:
await host . Services . StartMenu ( true ) ;
คุณสามารถดูตัวอย่างการทดสอบ E2E จริงได้ในโครงการ Tests
มีการวางแผนงานเพิ่มเติม เช่น การเปลี่ยนเส้นทางเมนูย่อยที่ซับซ้อนยิ่งขึ้น ขึ้นอยู่กับการเรียกกลับ การจัดการแถบความคืบหน้า และการโหลดคลาสเมนูแบบ Lazy Loading (ตอนนี้พวกเขากำลังโหลดอย่างกระตือรือร้นที่บูตสแตรปของแอป)