/// <summary>
        /// Конфигурация сервисов.
        /// </summary>
        /// <param name="services">Сервисы.</param>
        public void ConfigureServices(IServiceCollection services)
        {
            Log.Logger = new LoggerConfiguration()
                         .ReadFrom.Configuration(this.configuration)
                         .CreateLogger();

            Log.Information("Начинается регистрация политик CORS.");

            services.AddCors(o => o.AddPolicy("AllowAll", builder =>
            {
                builder.AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader();
            }));

            Log.Information("Регистрация политик CORS успешно завершена.");

            Log.Information("Начинается регистрация сервисов.");

            // Все сервисы имеют stateless реализацию и могут быть зарегистрированы как singleton.
            services.AddSingleton <IPlaceholderService, PlaceholderService>();

            services.AddSingleton <IPlaceholderRepository, PlaceholderRepository>(o =>
                                                                                  new PlaceholderRepository(
                                                                                      this.configuration.GetConnectionString("Placeholders"),
                                                                                      o.GetRequiredService <ILogger <PlaceholderRepository> >()));

            services.AddSingleton <GetAllPlaceholdersConsumer>();

            services.AddSingleton <GetPlaceholderConsumer>();

            Log.Information("Регистрация сервисов успешно завершена.");

            Log.Information("Начинается регистрация шины.");

            // Регистрация потребителей сообщений
            services.AddMassTransit(x =>
            {
                x.AddConsumer <GetAllPlaceholdersConsumer>();
                x.AddConsumer <GetPlaceholderConsumer>();
                x.AddConsumer <HealthcheckConsumer>();

                x.AddRequestClient <AuthorizeCommand>();

                x.UsingRabbitMq((context, configuration) =>
                {
                    BusConfiguration busConfiguration = this.configuration.GetSection("Bus").Get <BusConfiguration>();

                    configuration.Host(busConfiguration.ConnectionString, h =>
                    {
                        h.Username(busConfiguration.Username);
                        h.Password(busConfiguration.Password);

                        h.PublisherConfirmation = busConfiguration.PublisherConfirmation;
                    });

                    configuration.ConfigureEndpoints(context);
                });
            });

            // Регистрация сервисов MassTransit.
            services.AddMassTransitHostedService();

            // Регистрация клиентов для запроса данных от потребителей сообщений из api.
            // Каждый клиент зарегистрирован таким образом, что бы в рамках каждого запроса к api существовал свой клиент.
            services.AddScoped(serviceProvider => serviceProvider.GetRequiredService <IBus>()
                               .CreateRequestClient <GetAllPlaceholdersCommand>());
            services.AddScoped(serviceProvider => serviceProvider.GetRequiredService <IBus>()
                               .CreateRequestClient <GetPlaceholderCommand>());
            services.AddScoped(serviceProvider => serviceProvider.GetRequiredService <IBus>()
                               .CreateRequestClient <HealthcheckCommand>());
            services.AddScoped(serviceProvider => serviceProvider.GetRequiredService <IBus>()
                               .CreateRequestClient <AuthorizeCommand>());

            Log.Information("Регистрация шины успешно завершена.");

            Log.Information("Начинается регистрация фильтра авторизации.");

            // Регистрация фильтра авторизации.
            services.AddScoped <AuthorizationFilter>();
            Log.Information("Регистрация фильтра авторизации успешно завершена.");

            Log.Information("Начинается регистрация сервисов MVC.");
            services.AddControllers().PartManager.ApplicationParts.Add(new AssemblyPart(typeof(HealthController).Assembly));
            Log.Information("Регистрация сервисов MVC успешно завершена.");
        }
Beispiel #2
0
        /// <summary>
        /// Конфигурация сервисов.
        /// </summary>
        /// <param name="services">Сервисы.</param>
        public void ConfigureServices(IServiceCollection services)
        {
            Log.Logger = new LoggerConfiguration()
                         .ReadFrom.Configuration(this.configuration)
                         .CreateLogger();

            Log.Information("Начинается регистрация политик CORS.");

            services.AddCors(o => o.AddPolicy("AllowAll", builder =>
            {
                builder.AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader();
            }));

            Log.Information("Регистрация политик CORS успешно завершена.");

            Log.Information("Начинается регистрация сервисов.");

            // Все сервисы имеют stateless реализацию и могут быть зарегистрированы как singleton.
            services.AddSingleton <IPlaceholderService, PlaceholderService>();

            services.AddSingleton <IPlaceholderRepository, PlaceholderRepository>(o =>
                                                                                  new PlaceholderRepository(
                                                                                      this.configuration.GetConnectionString("Placeholders"),
                                                                                      o.GetRequiredService <ILogger <PlaceholderRepository> >()));

            services.AddSingleton <GetAllPlaceholdersConsumer>();

            services.AddSingleton <GetPlaceholderConsumer>();

            Log.Information("Регистрация сервисов успешно завершена.");

            Log.Information("Начинается регистрация шины.");

            // Регистрация потребителей сообщений
            services.AddMassTransit(x =>
            {
                x.AddConsumer <GetAllPlaceholdersConsumer>();
                x.AddConsumer <GetPlaceholderConsumer>();
                x.AddConsumer <HealthcheckConsumer>();

                x.AddRequestClient <AuthorizeCommand>();
            });

            // Регистрация шины.
            // Подробнее про регистрацию шины можно почитать здесь: https://masstransit-project.com/usage/
            services.AddSingleton(serviceProvider => Bus.Factory.CreateUsingRabbitMq(configure =>
            {
                BusConfiguration busConfiguration = this.configuration.GetSection("Bus").Get <BusConfiguration>();

                // Конфигурация подключения к шине, включающая в себя указание адреса и учетных данных.
                configure.Host(new Uri(busConfiguration.ConnectionString), host =>
                {
                    host.Username(busConfiguration.Username);
                    host.Password(busConfiguration.Password);

                    // Подтверждение получения гарантирует доставку сообщений за счет ухудшения производительности.
                    host.PublisherConfirmation = busConfiguration.PublisherConfirmation;
                });

                // Добавление Serilog для журналирования внутренностей MassTransit.
                configure.UseSerilog();

                // Регистрация очередей и их связи с потребителями сообщений.
                // В качестве метки сообщения используется полное имя класса сообщения, которое потребляет потребитель.
                configure.ReceiveEndpoint(typeof(GetAllPlaceholdersCommand).FullName, endpoint =>
                {
                    endpoint.Consumer <GetAllPlaceholdersConsumer>(serviceProvider);
                    EndpointConvention.Map <GetAllPlaceholdersCommand>(endpoint.InputAddress);
                });

                configure.ReceiveEndpoint(typeof(GetPlaceholderCommand).FullName, endpoint =>
                {
                    endpoint.Consumer <GetPlaceholderConsumer>(serviceProvider);
                    EndpointConvention.Map <GetPlaceholderCommand>(endpoint.InputAddress);
                });

                configure.ReceiveEndpoint(typeof(HealthcheckCommand).FullName, endpoint =>
                {
                    endpoint.Consumer <HealthcheckConsumer>(serviceProvider);
                    EndpointConvention.Map <HealthcheckCommand>(endpoint.InputAddress);
                });
            }));

            // Регистрация сервисов MassTransit.
            services.AddSingleton <IPublishEndpoint>(serviceProvider => serviceProvider.GetRequiredService <IBusControl>());
            services.AddSingleton <ISendEndpointProvider>(serviceProvider => serviceProvider.GetRequiredService <IBusControl>());
            services.AddSingleton <IBus>(serviceProvider => serviceProvider.GetRequiredService <IBusControl>());

            // Регистрация клиентов для запроса данных от потребителей сообщений из api.
            // Каждый клиент зарегистрирован таким образом, что бы в рамках каждого запроса к api существовал свой клиент.
            services.AddScoped(serviceProvider => serviceProvider.GetRequiredService <IBus>()
                               .CreateRequestClient <GetAllPlaceholdersCommand>());
            services.AddScoped(serviceProvider => serviceProvider.GetRequiredService <IBus>()
                               .CreateRequestClient <GetPlaceholderCommand>());
            services.AddScoped(serviceProvider => serviceProvider.GetRequiredService <IBus>()
                               .CreateRequestClient <HealthcheckCommand>());
            services.AddScoped(serviceProvider => serviceProvider.GetRequiredService <IBus>()
                               .CreateRequestClient <AuthorizeCommand>());

            // Регистрация сервиса шины MassTransit.
            services.AddSingleton <IHostedService, BusService>();
            Log.Information("Регистрация шины успешно завершена.");

            Log.Information("Начинается регистрация фильтра авторизации.");

            // Регистрация фильтра авторизации.
            services.AddScoped <AuthorizationFilter>();
            Log.Information("Регистрация фильтра авторизации успешно завершена.");

            Log.Information("Начинается регистрация сервисов MVC.");
            services.AddMvc();
            Log.Information("Регистрация сервисов MVC успешно завершена.");
        }