198 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			198 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using Autofac;
 | |
| using Autofac.Extensions.DependencyInjection;
 | |
| using HealthChecks.UI.Client;
 | |
| using Microsoft.AspNetCore.Builder;
 | |
| using Microsoft.AspNetCore.Diagnostics.HealthChecks;
 | |
| using Microsoft.Azure.ServiceBus;
 | |
| using Microsoft.eShopOnContainers.BuildingBlocks.EventBus;
 | |
| using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions;
 | |
| using Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ;
 | |
| using Microsoft.eShopOnContainers.BuildingBlocks.EventBusServiceBus;
 | |
| using Microsoft.Extensions.Configuration;
 | |
| using Microsoft.Extensions.DependencyInjection;
 | |
| using Microsoft.Extensions.Diagnostics.HealthChecks;
 | |
| using Microsoft.Extensions.Logging;
 | |
| using Payment.API.IntegrationEvents.EventHandling;
 | |
| using Payment.API.IntegrationEvents.Events;
 | |
| using RabbitMQ.Client;
 | |
| using System;
 | |
| 
 | |
| namespace Payment.API
 | |
| {
 | |
|     public class Startup
 | |
|     {
 | |
|         public Startup(IConfiguration configuration)
 | |
|         {
 | |
|             Configuration = configuration;
 | |
|         }
 | |
| 
 | |
|         public IConfiguration Configuration { get; }
 | |
| 
 | |
|         // This method gets called by the runtime. Use this method to add services to the container.
 | |
|         public IServiceProvider ConfigureServices(IServiceCollection services)
 | |
|         {
 | |
|             services.AddCustomHealthCheck(Configuration);
 | |
|             services.Configure<PaymentSettings>(Configuration);
 | |
| 
 | |
|             RegisterAppInsights(services);
 | |
| 
 | |
|             if (Configuration.GetValue<bool>("AzureServiceBusEnabled"))
 | |
|             {
 | |
|                 services.AddSingleton<IServiceBusPersisterConnection>(sp =>
 | |
|                 {
 | |
|                     var serviceBusConnectionString = Configuration["EventBusConnection"];
 | |
|                     var serviceBusConnection = new ServiceBusConnectionStringBuilder(serviceBusConnectionString);
 | |
|                     var subscriptionClientName = Configuration["SubscriptionClientName"];
 | |
| 
 | |
|                     return new DefaultServiceBusPersisterConnection(serviceBusConnection, subscriptionClientName);
 | |
|                 });
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 services.AddSingleton<IRabbitMQPersistentConnection>(sp =>
 | |
|                 {
 | |
|                     var logger = sp.GetRequiredService<ILogger<DefaultRabbitMQPersistentConnection>>();
 | |
|                     var factory = new ConnectionFactory()
 | |
|                     {
 | |
|                         HostName = Configuration["EventBusConnection"],
 | |
|                         DispatchConsumersAsync = true
 | |
|                     };
 | |
| 
 | |
|                     if (!string.IsNullOrEmpty(Configuration["EventBusUserName"]))
 | |
|                     {
 | |
|                         factory.UserName = Configuration["EventBusUserName"];
 | |
|                     }
 | |
| 
 | |
|                     if (!string.IsNullOrEmpty(Configuration["EventBusPassword"]))
 | |
|                     {
 | |
|                         factory.Password = Configuration["EventBusPassword"];
 | |
|                     }
 | |
| 
 | |
|                     var retryCount = 5;
 | |
|                     if (!string.IsNullOrEmpty(Configuration["EventBusRetryCount"]))
 | |
|                     {
 | |
|                         retryCount = int.Parse(Configuration["EventBusRetryCount"]);
 | |
|                     }
 | |
| 
 | |
|                     return new DefaultRabbitMQPersistentConnection(factory, logger, retryCount);
 | |
|                 });
 | |
|             }
 | |
| 
 | |
|             RegisterEventBus(services);
 | |
| 
 | |
|             var container = new ContainerBuilder();
 | |
|             container.Populate(services);
 | |
|             return new AutofacServiceProvider(container.Build());
 | |
|         }
 | |
| 
 | |
|         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
 | |
|         public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
 | |
|         {
 | |
|             //loggerFactory.AddAzureWebAppDiagnostics();
 | |
|             //loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Trace);
 | |
| 
 | |
|             var pathBase = Configuration["PATH_BASE"];
 | |
|             if (!string.IsNullOrEmpty(pathBase))
 | |
|             {
 | |
|                 app.UsePathBase(pathBase);
 | |
|             }
 | |
| 
 | |
|             ConfigureEventBus(app);
 | |
| 
 | |
|             app.UseRouting();
 | |
|             app.UseEndpoints(endpoints =>
 | |
|             {
 | |
|                 endpoints.MapHealthChecks("/hc", new HealthCheckOptions()
 | |
|                 {
 | |
|                     Predicate = _ => true,
 | |
|                     ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
 | |
|                 });
 | |
|                 endpoints.MapHealthChecks("/liveness", new HealthCheckOptions
 | |
|                 {
 | |
|                     Predicate = r => r.Name.Contains("self")
 | |
|                 });
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         private void RegisterAppInsights(IServiceCollection services)
 | |
|         {
 | |
|             services.AddApplicationInsightsTelemetry(Configuration);
 | |
|             services.AddApplicationInsightsKubernetesEnricher();
 | |
|         }
 | |
| 
 | |
|         private void RegisterEventBus(IServiceCollection services)
 | |
|         {
 | |
|             if (Configuration.GetValue<bool>("AzureServiceBusEnabled"))
 | |
|             {
 | |
|                 services.AddSingleton<IEventBus, EventBusServiceBus>(sp =>
 | |
|                 {
 | |
|                     var serviceBusPersisterConnection = sp.GetRequiredService<IServiceBusPersisterConnection>();
 | |
|                     var iLifetimeScope = sp.GetRequiredService<ILifetimeScope>();
 | |
|                     var logger = sp.GetRequiredService<ILogger<EventBusServiceBus>>();
 | |
|                     var eventBusSubcriptionsManager = sp.GetRequiredService<IEventBusSubscriptionsManager>();
 | |
| 
 | |
|                     return new EventBusServiceBus(serviceBusPersisterConnection, logger,
 | |
|                         eventBusSubcriptionsManager, iLifetimeScope);
 | |
|                 });
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 services.AddSingleton<IEventBus, EventBusRabbitMQ>(sp =>
 | |
|                 {
 | |
|                     var subscriptionClientName = Configuration["SubscriptionClientName"];
 | |
|                     var rabbitMQPersistentConnection = sp.GetRequiredService<IRabbitMQPersistentConnection>();
 | |
|                     var iLifetimeScope = sp.GetRequiredService<ILifetimeScope>();
 | |
|                     var logger = sp.GetRequiredService<ILogger<EventBusRabbitMQ>>();
 | |
|                     var eventBusSubcriptionsManager = sp.GetRequiredService<IEventBusSubscriptionsManager>();
 | |
| 
 | |
|                     var retryCount = 5;
 | |
|                     if (!string.IsNullOrEmpty(Configuration["EventBusRetryCount"]))
 | |
|                     {
 | |
|                         retryCount = int.Parse(Configuration["EventBusRetryCount"]);
 | |
|                     }
 | |
| 
 | |
|                     return new EventBusRabbitMQ(rabbitMQPersistentConnection, logger, iLifetimeScope, eventBusSubcriptionsManager, subscriptionClientName, retryCount);
 | |
|                 });
 | |
|             }
 | |
| 
 | |
|             services.AddTransient<OrderStatusChangedToStockConfirmedIntegrationEventHandler>();
 | |
|             services.AddSingleton<IEventBusSubscriptionsManager, InMemoryEventBusSubscriptionsManager>();
 | |
|         }
 | |
| 
 | |
|         private void ConfigureEventBus(IApplicationBuilder app)
 | |
|         {
 | |
|             var eventBus = app.ApplicationServices.GetRequiredService<IEventBus>();
 | |
|             eventBus.Subscribe<OrderStatusChangedToStockConfirmedIntegrationEvent, OrderStatusChangedToStockConfirmedIntegrationEventHandler>();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public static class CustomExtensionMethods
 | |
|     {
 | |
|         public static IServiceCollection AddCustomHealthCheck(this IServiceCollection services, IConfiguration configuration)
 | |
|         {
 | |
|             var hcBuilder = services.AddHealthChecks();
 | |
| 
 | |
|             hcBuilder.AddCheck("self", () => HealthCheckResult.Healthy());
 | |
| 
 | |
|             if (configuration.GetValue<bool>("AzureServiceBusEnabled"))
 | |
|             {
 | |
|                 hcBuilder
 | |
|                     .AddAzureServiceBusTopic(
 | |
|                         configuration["EventBusConnection"],
 | |
|                         topicName: "eshop_event_bus",
 | |
|                         name: "payment-servicebus-check",
 | |
|                         tags: new string[] { "servicebus" });
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 hcBuilder
 | |
|                     .AddRabbitMQ(
 | |
|                         $"amqp://{configuration["EventBusConnection"]}",
 | |
|                         name: "payment-rabbitmqbus-check",
 | |
|                         tags: new string[] { "rabbitmqbus" });
 | |
|             }
 | |
| 
 | |
|             return services;
 | |
|         }
 | |
|     }
 | |
| } |