Esempio n. 1
0
        /// <summary>
        /// Initializes an instance of <see cref="CliApplication"/>.
        /// </summary>
        internal CliApplication(IServiceProvider serviceProvider,
                                IConsole console,
                                EnvironmentVariablesAccessor environmentVariablesAccessor,
                                ApplicationMetadata metadata,
                                Action <ApplicationMetadata, IConsole>?startupMessage)
        {
            _serviceProvider = serviceProvider;

            _environmentVariablesAccessor = environmentVariablesAccessor;
            _metadata       = metadata;
            _startupMessage = startupMessage;
            _console        = console;

            _logger              = serviceProvider.GetRequiredService <ILogger <CliApplication> >();
            _cliCommandExecutor  = serviceProvider.GetRequiredService <ICliCommandExecutor>();
            _rootSchemaAccessor  = serviceProvider.GetRequiredService <IRootSchemaAccessor>();
            _applicationLifetime = (CliApplicationLifetime)serviceProvider.GetRequiredService <ICliApplicationLifetime>();
        }
Esempio n. 2
0
        /// <summary>
        /// Creates an instance of <see cref="CliApplication"/> using configured parameters.
        /// Default values are used in place of parameters that were not specified.
        /// A scope is defined as a lifetime of a command execution pipeline that includes directives handling.
        /// </summary>
        public CliApplication Build()
        {
            if (_cliApplicationBuilt)
            {
                throw new InvalidOperationException("Build can only be called once.");
            }

            _cliApplicationBuilt = true;

            // Set default values
            _title ??= AssemblyUtils.TryGetDefaultTitle() ?? "App";
            _executableName ??= AssemblyUtils.TryGetDefaultExecutableName() ?? "app";
            _versionText ??= AssemblyUtils.TryGetDefaultVersionText() ?? "v1.0";
            _console ??= new SystemConsole();

            if (_startupMode is null || _modeTypes.Count == 0)
            {
                this.UseDirectMode(true);
            }

            // Add core middlewares to the end of the pipeline
            this.AddAfterUserMiddlewares();

            // Create context
            var _serviceCollection = new ServiceCollection();

            var metadata      = new ApplicationMetadata(_title, _executableName, _versionText, _description);
            var configuration = new ApplicationConfiguration(_modeTypes,
                                                             _commandTypes,
                                                             _directivesTypes,
                                                             _middlewareTypes,
                                                             _startupMode !,
                                                             _serviceCollection);

            var environmentVariablesAccessor = new EnvironmentVariablesAccessor();

            // Add core services
            _serviceCollection.AddOptions();
            _serviceCollection.AddSingleton(typeof(ApplicationMetadata), metadata);
            _serviceCollection.AddSingleton(typeof(ApplicationConfiguration), configuration);
            _serviceCollection.AddSingleton(typeof(IConsole), _console);
            _serviceCollection.AddSingleton(typeof(IEnvironmentVariablesAccessor), environmentVariablesAccessor);
            _serviceCollection.AddSingleton <IRootSchemaAccessor, RootSchemaAccessor>();
            _serviceCollection.AddSingleton <ICliCommandExecutor, CliCommandExecutor>();
            _serviceCollection.AddSingleton <ICliApplicationLifetime, CliApplicationLifetime>();

            _serviceCollection.AddScoped(typeof(ICliContext), (provider) =>
            {
                IRootSchemaAccessor rootSchemaAccessor = provider.GetRequiredService <IRootSchemaAccessor>();

                return(new CliContext(metadata,
                                      configuration,
                                      rootSchemaAccessor.RootSchema,
                                      environmentVariablesAccessor.EnvironmentVariables,
                                      _console));
            });

            _serviceCollection.AddLogging(cfg =>
            {
                cfg.ClearProviders();
                cfg.AddDebug();
                cfg.SetMinimumLevel(LogLevel.Information);
            });

            IServiceProvider serviceProvider = CreateServiceProvider(_serviceCollection);

            return(new CliApplication(serviceProvider, _console, environmentVariablesAccessor, metadata, _startupMessage));
        }