private IServiceProvider Build(string[] args, Type[] commandTypes, Action <CoconaLiteAppOptions>?configureOptions) { var services = new CoconaLiteServiceCollection(); var options = new CoconaLiteAppOptions() { CommandTypes = commandTypes, }; configureOptions?.Invoke(options); services.AddSingleton(options); services.AddCoconaCore(args); services.AddCoconaShellCompletion(); _configureServicesDelegate?.Invoke(services); var serviceProvider = new CoconaLiteServiceProvider(services); serviceProvider.GetService <ICoconaCommandDispatcherPipelineBuilder>() .UseMiddleware <HandleExceptionAndExitMiddleware>() .UseMiddleware <HandleParameterBindExceptionMiddleware>() .UseMiddleware <RejectUnknownOptionsMiddleware>() .UseMiddleware <CommandFilterMiddleware>() .UseMiddleware((next, sp) => new InitializeCoconaLiteConsoleAppMiddleware(next, sp.GetService <ICoconaAppContextAccessor>())) .UseMiddleware <CoconaCommandInvokeMiddleware>(); return(serviceProvider); }
private IServiceProvider Build(string[] args, Type[] commandTypes, Action <CoconaLiteAppOptions>?configureOptions) { var services = new CoconaLiteServiceProvider(); var options = new CoconaLiteAppOptions() { CommandTypes = commandTypes, }; configureOptions?.Invoke(options); services.AddSingleton(options); services.AddSingleton <ICoconaInstanceActivator>(_ => new CoconaLiteInstanceActivator()); services.AddSingleton <ICoconaCommandLineArgumentProvider>(sp => new CoconaCommandLineArgumentProvider(args)); services.AddSingleton <ICoconaCommandProvider>(sp => { var options = (CoconaLiteAppOptions)sp.GetService(typeof(CoconaLiteAppOptions)); return(new CoconaBuiltInCommandProvider( new CoconaCommandProvider( options.CommandTypes.ToArray(), options.TreatPublicMethodsAsCommands, options.EnableConvertOptionNameToLowerCase, options.EnableConvertCommandNameToLowerCase ) )); }); services.AddSingleton <ICoconaCommandDispatcherPipelineBuilder>(sp => new CoconaCommandDispatcherPipelineBuilder(sp, sp.GetService <ICoconaInstanceActivator>())); services.AddSingleton <ICoconaAppContextAccessor>(sp => new CoconaAppContextAccessor()); services.AddSingleton <ICoconaApplicationMetadataProvider>(sp => new CoconaApplicationMetadataProvider()); services.AddSingleton <ICoconaConsoleProvider>(sp => new CoconaConsoleProvider()); services.AddSingleton <ICoconaParameterValidatorProvider>(sp => new DataAnnotationsParameterValidatorProvider()); services.AddSingleton <ICoconaParameterBinder>(sp => new CoconaParameterBinder(sp, sp.GetService <ICoconaValueConverter>(), sp.GetService <ICoconaParameterValidatorProvider>())); services.AddSingleton <ICoconaValueConverter>(sp => new CoconaValueConverter()); services.AddSingleton <ICoconaCommandLineParser>(sp => new CoconaCommandLineParser()); services.AddSingleton <ICoconaCommandDispatcher>(sp => new CoconaCommandDispatcher(sp, sp.GetService <ICoconaCommandProvider>(), sp.GetService <ICoconaCommandLineParser>(), sp.GetService <ICoconaCommandLineArgumentProvider>(), sp.GetService <ICoconaCommandDispatcherPipelineBuilder>(), sp.GetService <ICoconaCommandMatcher>(), sp.GetService <ICoconaInstanceActivator>(), sp.GetService <ICoconaAppContextAccessor>())); services.AddSingleton <ICoconaCommandMatcher>(sp => new CoconaCommandMatcher()); services.AddSingleton <ICoconaHelpRenderer>(sp => new CoconaHelpRenderer()); services.AddSingleton <ICoconaCommandHelpProvider>(sp => new CoconaCommandHelpProvider(sp.GetService <ICoconaApplicationMetadataProvider>(), sp)); _configureServicesDelegate?.Invoke(services); IServiceProvider serviceProvider = services; serviceProvider.GetService <ICoconaCommandDispatcherPipelineBuilder>() .UseMiddleware <BuiltInCommandMiddleware>() .UseMiddleware <HandleExceptionAndExitMiddleware>() .UseMiddleware <HandleParameterBindExceptionMiddleware>() .UseMiddleware <RejectUnknownOptionsMiddleware>() .UseMiddleware <CommandFilterMiddleware>() .UseMiddleware((next, sp) => new InitializeCoconaLiteConsoleAppMiddleware(next, sp.GetService <ICoconaAppContextAccessor>())) .UseMiddleware <CoconaCommandInvokeMiddleware>(); return(serviceProvider); }
public void HasDependency_Transient_TService_TImplementation() { var services = new CoconaLiteServiceCollection(); services.AddTransient <IMyService, MyService>(); services.AddTransient <IYetAnotherService, YetAnotherService>(); var serviceProvider = new CoconaLiteServiceProvider(services); var instance = serviceProvider.GetService <IYetAnotherService>(); instance.Should().NotBeNull(); instance.Should().BeOfType <YetAnotherService>(); ((YetAnotherService)instance).MyService.Should().NotBeNull(); serviceProvider.Dispose(); ((YetAnotherService)instance).IsDisposed.Should().BeTrue(); ((MyService)((YetAnotherService)instance).MyService).IsDisposed.Should().BeTrue(); }
public void NoDependency_Singleton_TService_Factory() { var services = new CoconaLiteServiceCollection(); services.AddSingleton <IMyService>(_ => new MyService()); var serviceProvider = new CoconaLiteServiceProvider(services); var instance = serviceProvider.GetService <IMyService>(); instance.Should().NotBeNull(); instance.Should().BeOfType <MyService>(); var instance2 = serviceProvider.GetService <IMyService>(); instance.Should().BeSameAs(instance2); instance.Id.Should().Be(instance2.Id); serviceProvider.Dispose(); ((MyService)instance).IsDisposed.Should().BeTrue(); }
public void NoDependency_Transient_TService_TImplementation() { var services = new CoconaLiteServiceCollection(); services.AddTransient <IMyService, MyService>(); var serviceProvider = new CoconaLiteServiceProvider(services); var instance = serviceProvider.GetService <IMyService>(); instance.Should().NotBeNull(); instance.Should().BeOfType <MyService>(); var instance2 = serviceProvider.GetService <IMyService>(); instance.Should().NotBeSameAs(instance2); instance.Id.Should().NotBe(instance2.Id); serviceProvider.Dispose(); ((MyService)instance).IsDisposed.Should().BeTrue(); ((MyService)instance2).IsDisposed.Should().BeTrue(); }