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);
        }
Exemple #2
0
        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();
        }