الهدف من هذه المكتبة هو تبسيط إنشاء أدوات تطبيق وحدة التحكم إلى حد كبير، من خلال التعامل مع أساسيات التحكم في المستخدم، والسماح لك بالتركيز على قيمة عملك.
التركيز هنا هو الكفاءة والبساطة. هذه ليست مكتبة لرسم لوحة معلومات معقدة في فن 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 ) ;
يمكنك رؤية مثال حقيقي لاختبارات E2E في مشروع Tests
.
يتم التخطيط لمزيد من العمل مثل إعادة توجيه قائمة فرعية أكثر تعقيدًا اعتمادًا على إرجاع رد الاتصال ومعالجة شريط التقدم والتحميل البطيء لفئات القائمة (يتم الآن تحميلها بفارغ الصبر في تمهيد التطبيق).