Console Commands
Turns a class into a command an operator can type at a running .NET application. Assemblies are scanned for command classes, names and aliases are mapped, string input is converted into ExecuteAsync parameters, and each line is dispatched from an input loop.
Commands are ordinary DI-created classes: one that needs application services declares its own constructor, and one that needs none declares no constructor at all.
Categories
- Extensions — startup methods that register the input loop and discover command classes.
- Attributes — class metadata for command names, aliases, descriptions, and examples.
- Services — the input loop application code starts and stops.
- Utilities — command metadata read by reflection, for building a help listing.
- Types — the base class commands inherit, the metadata it is described by, and the failure raised when one throws.
Quick Example
csharp
using Microsoft.Extensions.Hosting;
using AlmightyShogun.ConsoleCommands;
using Microsoft.Extensions.DependencyInjection;
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Services
.AddConsoleCommands()
.RegisterConsoleCommands()
.AddHostedService<ConsoleCommandWorker>();
await builder.Build().RunAsync();csharp
using Microsoft.Extensions.Hosting;
using AlmightyShogun.ConsoleCommands;
public sealed class ConsoleCommandWorker(
IConsoleCommandHandler commandHandler
) : BackgroundService
{
protected override Task ExecuteAsync(
CancellationToken cancellationToken
) => commandHandler.StartAsync(cancellationToken);
}csharp
using AlmightyShogun.ConsoleCommands;
[Alias("p")]
[Example("production")]
[ConsoleCommand("ping", "Writes a pong response.")]
public sealed class PingCommand : ConsoleCommandBase
{
public Task ExecuteAsync(string environment)
{
Console.WriteLine($"pong from {environment}");
return Task.CompletedTask;
}
}