/// <summary>
        /// Конфигурирование сервисов.
        /// </summary>
        /// <param name="buildContext">Контекст построения приложения.</param>
        public void ConfigureServices(BuildContext buildContext)
        {
            var logger = buildContext.Logger;

            StartupConfiguration startupConfiguration = buildContext.StartupConfiguration;
            var configurationRoot = buildContext.ConfigurationRoot;
            var services          = buildContext.ServiceCollection;

            // Заменяем реализацию фабрики опций на свою.
            services.Add(ServiceDescriptor.Transient(typeof(IOptionsFactory <>), typeof(Configuration.OptionsFactory <>)));

            // Добавляем поддержку IOptions, IOptionsSnapshot, IOptionsMonitor
            services.AddOptions();

            // Logging
            services.RegisterLogging(buildContext.LoggerFactory);

            // Регистрируем строготипизированные конфигурации.
            services.RegisterConfigurationTypes(configurationRoot, buildContext.ExportedTypes, startupConfiguration);

            // Регистрируем типы по атрибуту [Register]
            services.RegisterWithRegisterAttribute(buildContext.ExportedTypes);

            // todo: зарегистрировать не исходные типы, а результирующий
            services.AddSingleton(buildContext.StartupConfiguration);
            services.AddSingleton(buildContext.StartupInfo);

            var modulesOptions = startupConfiguration.Modules;

            startupConfiguration.ConfigureModules(modulesOptions);

            // Регистрируем модули.
            List <Type> moduleTypes = new List <Type>();

            if (modulesOptions.AutoDiscoverModules)
            {
                moduleTypes = buildContext.ExportedTypes.GetClassTypesAssignableTo <IModule>().ToList();

                logger.LogInformation($"Found {moduleTypes.Count} modules:");
                foreach (var moduleType in moduleTypes)
                {
                    logger.LogInformation($"Autodiscovered module: {moduleType.Name}");
                }
            }

            var userDefinedModules = modulesOptions.ModuleTypes;

            if (userDefinedModules.Length > 0)
            {
                logger.LogInformation("UserDefinedModules modules:");
                foreach (var moduleType in userDefinedModules)
                {
                    logger.LogInformation($"UserDefined module: {moduleType.Name}");
                }
                moduleTypes.AddRange(userDefinedModules);
            }

            if (moduleTypes.Count > 0)
            {
                services.RegisterModules(moduleTypes);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Конфигурирование сервисов.
        /// </summary>
        /// <param name="buildContext">Контекст построения приложения.</param>
        public void ConfigureServices(BuildContext buildContext)
        {
            var logger = buildContext.Logger;

            logger.LogInformation("ConfigureServices started");

            StartupConfiguration startupConfiguration = buildContext.StartupConfiguration;
            ILoggerFactory       loggerFactory        = buildContext.LoggerFactory;
            var configurationRoot = buildContext.ConfigurationRoot;
            var services          = buildContext.ServiceCollection;

            // Logging
            services.RegisterLogging(loggerFactory);

            // Регистрируем строготипизированные конфигурации.
            services.RegisterConfigurationTypes(configurationRoot, buildContext.ExportedTypes, startupConfiguration.Profile);

            // Регистрируем типы по атрибуту [Register]
            services.RegisterWithRegisterAttribute(buildContext.ExportedTypes);

            // todo: зарегистрировать не исходные типы, а результирующий
            services.AddSingleton(buildContext.StartupConfiguration);
            services.AddSingleton(buildContext.StartupInfo);

            var modulesOptions = startupConfiguration.Modules;

            startupConfiguration.ConfigureModules(modulesOptions);

            // Регистрируем модули.
            List <Type> moduleTypes = new List <Type>();

            if (modulesOptions.AutoDiscoverModules)
            {
                moduleTypes = buildContext.ExportedTypes.GetClassTypesAssignableTo <IModule>().ToList();

                logger.LogInformation($"Found {moduleTypes.Count} modules:");
                foreach (var moduleType in moduleTypes)
                {
                    logger.LogInformation($"Autodiscovered module: {moduleType.Name}");
                }
            }

            var userDefinedModules = modulesOptions.ModuleTypes;

            if (userDefinedModules.Length > 0)
            {
                logger.LogInformation("UserDefinedModules modules:");
                foreach (var moduleType in userDefinedModules)
                {
                    logger.LogInformation($"UserDefined module: {moduleType.Name}");
                }
                moduleTypes.AddRange(userDefinedModules);
            }

            if (moduleTypes.Count > 0)
            {
                services.RegisterModules(moduleTypes);
            }

            logger.LogInformation("ConfigureServices finished");
        }