MenuCLI
Official Release
このライブラリの目的は、ユーザー コントロールの基本を処理することでコンソール アプリ ツールの作成を大幅に簡素化し、ビジネス価値に集中できるようにすることです。
ここで焦点を当てているのは効率性とシンプルさです。これは複雑なダッシュボードをアスキーアートで描画するためのライブラリではありません。
[ 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 ) ;
E2E テストの実際の例は、 Tests
プロジェクトで見ることができます。
コールバックの戻り、プログレスバーの処理、メニュークラスの遅延読み込みに応じて、より複雑なサブメニューのリダイレクトなど、さらなる作業が計画されています(現在、それらはアプリのブートストラップで積極的に読み込まれています)。