using Microsoft.Extensions.DependencyInjection;
var container = new ServiceCollection();
container.AddTransient<ICommandBuilder, CommandBuilder>();
container.AddTransient<ICommand<Context1>, Context1Command>();
var provider = container.BuildServiceProvider();
var commandBuilder = provider.GetRequiredService<ICommandBuilder>();
Console.WriteLine(commandBuilder.Execute(new Context1()));
interface ICommand<TContext>
object Execute(TContext context);
interface ICommandBuilder
object Execute<TContext>(TContext context);
class CommandBuilder : ICommandBuilder
private readonly IServiceProvider _serviceProvider;
public CommandBuilder(IServiceProvider serviceProvider)
_serviceProvider = serviceProvider;
public object Execute<TContext>(TContext context)
var command = _serviceProvider.GetRequiredService<ICommand<TContext>>();
return command.Execute(context);
public string Value => "test";
class Context1Command : ICommand<Context1>
public object Execute(Context1 context) => context.Value;