MenuCLI
Official Release
該庫的目標是透過為您處理用戶控制的基礎知識,大幅簡化控制台應用程式工具的創建,並讓您專注於您的業務價值。
這裡的重點是效率和簡單性。這不是用 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 的內容,然後重新導向到 SubMenu。
該函式庫可以像這樣處理非同步呼叫:
[ 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 ) ;
您可以在Tests
專案中看到 E2E 測試的真實範例。
計劃進行更多工作,例如更複雜的子選單重定向,取決於回調返回、進度條處理和選單類別的延遲載入(現在它們在應用程式的引導程式中急切地載入)。