namespace ASC.Api.Core.Extensions; public static class ServiceCollectionExtension { public static void AddCacheNotify(this IServiceCollection services, IConfiguration configuration) { var redisConfiguration = configuration.GetSection("Redis").Get(); var kafkaConfiguration = configuration.GetSection("kafka").Get(); var rabbitMQConfiguration = configuration.GetSection("RabbitMQ").Get(); if (redisConfiguration != null) { services.AddStackExchangeRedisExtensions(redisConfiguration); services.AddSingleton(typeof(ICacheNotify<>), typeof(RedisCacheNotify<>)); } else if (rabbitMQConfiguration != null) { services.AddSingleton(typeof(ICacheNotify<>), typeof(RabbitMQCache<>)); } else if (kafkaConfiguration != null) { services.AddSingleton(typeof(ICacheNotify<>), typeof(KafkaCacheNotify<>)); } else { services.AddSingleton(typeof(ICacheNotify<>), typeof(MemoryCacheNotify<>)); } } public static void AddDistributedCache(this IServiceCollection services, IConfiguration configuration) { var redisConfiguration = configuration.GetSection("Redis").Get(); if (redisConfiguration != null) { services.AddStackExchangeRedisCache(config => { config.ConfigurationOptions = redisConfiguration.ConfigurationOptions; }); } else { services.AddDistributedMemoryCache(); } } public static void AddEventBus(this IServiceCollection services, IConfiguration configuration) { services.AddSingleton(); var rabbitMQConfiguration = configuration.GetSection("RabbitMQ").Get(); if (rabbitMQConfiguration != null) { services.AddSingleton(sp => { var cfg = sp.GetRequiredService(); var settings = cfg.GetSection("RabbitMQ").Get(); var logger = sp.GetRequiredService>(); var factory = new ConnectionFactory() { HostName = settings.HostName, DispatchConsumersAsync = true }; if (!string.IsNullOrEmpty(settings.UserName)) { factory.UserName = settings.UserName; } if (!string.IsNullOrEmpty(settings.Password)) { factory.Password = settings.Password; } var retryCount = 5; if (!string.IsNullOrEmpty(cfg["core:eventBus:connectRetryCount"])) { retryCount = int.Parse(cfg["core:eventBus:connectRetryCount"]); } return new DefaultRabbitMQPersistentConnection(factory, logger, retryCount); }); services.AddSingleton(sp => { var cfg = sp.GetRequiredService(); var rabbitMQPersistentConnection = sp.GetRequiredService(); var iLifetimeScope = sp.GetRequiredService(); var logger = sp.GetRequiredService>(); var eventBusSubcriptionsManager = sp.GetRequiredService(); var serializer = new ASC.EventBus.Serializers.ProtobufSerializer(); var subscriptionClientName = "asc_event_bus_default_queue"; if (!string.IsNullOrEmpty(cfg["core:eventBus:subscriptionClientName"])) { subscriptionClientName = cfg["core:eventBus:subscriptionClientName"]; } var retryCount = 5; if (!string.IsNullOrEmpty(cfg["core:eventBus:connectRetryCount"])) { retryCount = int.Parse(cfg["core:eventBus:connectRetryCount"]); } return new EventBusRabbitMQ(rabbitMQPersistentConnection, logger, iLifetimeScope, eventBusSubcriptionsManager, serializer, subscriptionClientName, retryCount); }); } else { throw new NotImplementedException("EventBus: Provider not found."); } } /// /// Add a IHostedService for given type. /// Only one copy of this instance type will active in multi process architecture. /// public static void AddActivePassiveHostedService(this IServiceCollection services) where T : class, IHostedService { var diHelper = new DIHelper(services); diHelper.TryAdd, RegisterInstanceDao>(); diHelper.TryAdd, RegisterInstanceManager>(); services.AddHostedService>(); diHelper.TryAdd(); services.AddHostedService(); } public static void AddDistributedTaskQueue(this IServiceCollection services) { services.AddTransient(); services.AddSingleton(); } }