Consider leaving a ⭐
Do more, with less. With speed, compatibility and fluent integration in mind.
Commands.NET aims to improve your experience integrating input from different sources* into the same, concurrent pool and treating them as triggered actions, called commands. It provides a modular and intuitive API for registering and executing commands.
*Sources can range from command-line, console, chatboxes, to social platforms like Discord, Slack, Messenger & much, much more.
Browse the wiki for a full overview of the library.
Commands.NET is available on NuGet. You can install it using the package manager, or the following command:
dotnet add package Commands.NET
dotnet add package Commands.NET.Hosting
Alternatively, adding it to your .csproj
file:
<PackageReference Include="Commands.NET" Version="x.x.x" />
<PackageReference Include="Commands.NET.Hosting" Version="x.x.x" />
The hosting package is optional.
A command is a method executed when a specific syntax is provided. By creating a manager to contain said command, you can run it with the provided arguments.
using Commands;
var components = new ComponentTree()
{
new Command(() => "Hello world!", "greet");
};
var provider = new ComponentProvider(components);
await provider.Execute(new ConsoleContext(args));
// dotnet run greet -> Hello world!
Command groups are named collections of commands or other command groups. Groups allow for subcommand creation, where the group name is a category for its children.
using Commands;
var mathGroup = new ComponentGroup("math")
{
new Command((double number, int sumBy) => number + sumBy,
"sum", "add"),
new Command((double number, int subtractBy) => number - subtractBy,
"subtract", "sub"),
new Command((double number, int multiplyBy) => number * multiplyBy,
"multiply", "mul"),
new Command((double number, int divideBy) => number / divideBy,
"divide", "div")
};
var provider = new ComponentProvider();
provider.Components.Add(mathGroup);
await collection.Execute(new ConsoleContext(args));
// dotnet run math sum 5 3 -> 8
Command modules are classes that can contain commands or nested command modules, which themselves can also contain (sub)commands.
using Commands;
public class HelpModule : CommandModule
{
[Name("help")]
public void Help()
{
var builder = new StringBuilder()
.AppendLine("Commands:");
foreach (var command in Manager!.GetCommands())
builder.AppendLine(command.GetFullName());
Respond(builder.ToString());
}
}
...
var provider = new ComponentProvider();
provider.Components.Add<HelpModule>();
provider.Components.Add(mathGroup);
await provider.Execute(new ConsoleContext(args));
// dotnet run help -> Commands: math sum <...> math subtract <...> math ...
Commands.NET is designed to be compatible with dependency injection out of the box, propagating IServiceProvider
throughout the execution flow.
using Commands;
using Microsoft.Extensions.DependencyInjection;
...
var services = new ServiceCollection()
.AddSingleton<MyService>()
.AddSingleton<ComponentProvider>();
.BuildServiceProvider();
var provider = services.GetRequiredService<ComponentProvider>();
provider.Components.Add<HelpModule>();
provider.Components.Add(mathGroup);
await provider.Execute(new ConsoleContext(args), new ExecutionOptions() { Services = services });
Modules can be injected directly from the provider. They themselves are considered transient, being created and disposed of per command execution.
public class ServicedModule(MyService service) : CommandModule
{
}
Alongside dependency injection support in the base package, Commands.NET provides an extension package for the .NET Generic Host, allowing you to integrate Commands.NET into your application with ease.
using Commands.Hosting;
using Microsoft.Extensions.Hosting;
var host = Host.CreateDefaultBuilder(args)
.ConfigureComponents(configure => ...)
.Build();
The extension package supports factory-based command execution alongside scope management, allowing you to manage the lifetime of your commands and modules.
- Commands.Samples.Core
- Manage, create and execute commands in a basic console application.
- Commands.Samples.Console
- Fluent API's, complex execution flow and workflow expansion.
- Commands.Samples.Hosting
- Integrating Commands.NET into the .NET Generic Host infrastructure.
- Commands.Samples.FSharp
- Use Commands.NET in F# projects.
Benchmark results are found here.