// (c) Copyright Ascensio System SIA 2010-2022 // // This program is a free software product. // You can redistribute it and/or modify it under the terms // of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software // Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended // to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of // any third-party rights. // // This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see // the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html // // You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021. // // The interactive user interfaces in modified source and object code versions of the Program must // display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3. // // Pursuant to Section 7(b) of the License you must retain the original Product logo when // distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under // trademark law for use of our trademarks. // // All the Product's GUI elements, including illustrations and icon sets, as well as technical writing // content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0 // International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode 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 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(); } }