using Ninject; using Ninject.Parameters; using System; using System.CommandLine.Binding; using System.CommandLine.Invocation; using System.Linq; using System.Threading.Tasks; namespace CustomHostingDemo { public interface ICommandHandler { Task InvokeAsync(InvocationContext context, TArg args); } public class NinjectCommandHandler : ICommandHandler { private readonly IKernel _kernel; private readonly Type _handlerType; public NinjectCommandHandler(IKernel kernel, Type handlerType) { _kernel = kernel; _handlerType = handlerType; if (!typeof(ICommandHandler).IsAssignableFrom(_handlerType)) { throw new ArgumentException($"The handler type must implement ICommandHandler<{typeof(TArg).Name}>", nameof(handlerType)); } } public Task InvokeAsync(InvocationContext context) { var cmdArgs = _kernel.Get(); var binder = new ModelBinder(); binder.UpdateInstance(cmdArgs, context.BindingContext); var handler = (ICommandHandler)_kernel.Get(_handlerType, new CommandContextParameter(context, cmdArgs as IDefaultArgs)); return handler.InvokeAsync(context, cmdArgs); } } }