Cara menggunakan middleware di System.CommandLine
Penting
System.CommandLine
saat ini dalam PRATINJAU, dan dokumentasi ini untuk versi 2.0 beta 4.
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Artikel ini menjelaskan cara bekerja dengan middleware di aplikasi baris perintah yang dibangun dengan pustaka System.CommandLine
. Penggunaan middleware adalah topik lanjutan yang tidak perlu dipertimbangkan oleh sebagian besar pengguna System.CommandLine
.
Pengantar middleware
Meskipun setiap perintah memiliki handler yang akan dirutekan oleh System.CommandLine
berdasarkan input, terdapat juga mekanisme untuk melakukan sirkuit pendek atau mengubah input sebelum logika aplikasi Anda dipanggil. Di antara penguraian dan pemanggilan, terdapat rantai tanggung jawab, yang dapat Anda sesuaikan. Sejumlah fitur bawaan System.CommandLine
memanfaatkan kemampuan ini. Inilah cara sirkuit pendek opsi --help
dan --version
memanggil ke handler Anda.
Setiap panggilan dalam alur dapat mengambil tindakan berdasarkan ParseResult dan kembali lebih awal, atau memilih untuk memanggil item berikutnya dalam alur. Bahkan ParseResult
dapat diganti selama fase ini. Panggilan terakhir dalam rantai adalah handler untuk perintah yang ditentukan.
Menambahkan ke alur middleware
Anda dapat menambahkan panggilan ke alur ini dengan memanggil CommandLineBuilderExtensions.AddMiddleware. Berikut adalah contoh kode yang memungkinkan direktif kustom. Setelah membuat perintah root bernama rootCommand
, kode seperti biasa menambahkan opsi, argumen, dan handler. Kemudian middleware ditambahkan:
var commandLineBuilder = new CommandLineBuilder(rootCommand);
commandLineBuilder.AddMiddleware(async (context, next) =>
{
if (context.ParseResult.Directives.Contains("just-say-hi"))
{
context.Console.WriteLine("Hi!");
}
else
{
await next(context);
}
});
commandLineBuilder.UseDefaults();
var parser = commandLineBuilder.Build();
await parser.InvokeAsync(args);
Dalam kode sebelumnya, middleware menulis "Hai!" jika direktif [just-say-hi]
ditemukan dalam hasil penguraian. Ketika ini terjadi, handler normal perintah tidak dipanggil. Ia tidak dipanggil karena middleware tidak memanggil delegasi next
.
Dalam contoh, context
adalah InvocationContext, struktur database tunggal yang bertindak sebagai "akar" dari seluruh proses penanganan perintah. Ini adalah struktur yang paling kuat dalam System.CommandLine
, dalam hal kemampuan. Terdapat dua kegunaan utama baginya di middleware:
- Ia menyediakan akses ke BindingContext, Parser, Console, dan HelpBuilder untuk mengambil dependensi yang diperlukan middleware untuk logika kustomnya.
- Anda dapat mengatur properti InvocationResult atau ExitCode untuk mengakhiri pemrosesan perintah dengan cara sirkuit pendek. Contohnya adalah opsi
--help
, yang diimplementasikan dengan cara ini.
Berikut adalah program lengkapnya, termasuk direktif using
yang diperlukan.
using System.CommandLine;
using System.CommandLine.Builder;
using System.CommandLine.Parsing;
class Program
{
static async Task Main(string[] args)
{
var delayOption = new Option<int>("--delay");
var messageOption = new Option<string>("--message");
var rootCommand = new RootCommand("Middleware example");
rootCommand.Add(delayOption);
rootCommand.Add(messageOption);
rootCommand.SetHandler((delayOptionValue, messageOptionValue) =>
{
DoRootCommand(delayOptionValue, messageOptionValue);
},
delayOption, messageOption);
var commandLineBuilder = new CommandLineBuilder(rootCommand);
commandLineBuilder.AddMiddleware(async (context, next) =>
{
if (context.ParseResult.Directives.Contains("just-say-hi"))
{
context.Console.WriteLine("Hi!");
}
else
{
await next(context);
}
});
commandLineBuilder.UseDefaults();
var parser = commandLineBuilder.Build();
await parser.InvokeAsync(args);
}
public static void DoRootCommand(int delay, string message)
{
Console.WriteLine($"--delay = {delay}");
Console.WriteLine($"--message = {message}");
}
}
Berikut adalah contoh baris perintah dan output yang dihasilkan dari kode sebelumnya:
myapp [just-say-hi] --delay 42 --message "Hello world!"
Hi!