using Fengling.RiskControl; using Fengling.RiskControl.Configuration; using Fengling.RiskControl.Counter; using Fengling.RiskControl.Evaluation; using Fengling.RiskControl.Events; using Fengling.RiskControl.Failover; using Fengling.RiskControl.Rules; using Fengling.RiskControl.Sampling; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using DotNetCore.CAP; using StackExchange.Redis; namespace Microsoft.Extensions.DependencyInjection; public static class RiskControlClientServiceExtensions { public static IServiceCollection AddRiskControlClientCore( this IServiceCollection services, Action? configureOptions = null) { if (configureOptions != null) { services.Configure(configureOptions); } services.TryAddSingleton(sp => { var options = sp.GetRequiredService>().Value; return options; }); services.TryAddSingleton(sp => { var options = sp.GetRequiredService(); var connectionString = options.Redis.ConnectionString; var connection = ConnectionMultiplexer.Connect(connectionString); return connection; }); services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); if (services.Any(s => s.ServiceType == typeof(ICapPublisher))) { services.TryAddSingleton(); } else { services.TryAddSingleton(); } services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(sp => sp.GetRequiredService()); return services; } public static IServiceCollection AddRiskControlClient( this IServiceCollection services, Action configureOptions) { services.Configure(configureOptions); services.AddRiskControlClientCore(); return services; } } internal class NoOpEventPublisher : IRiskEventPublisher { private readonly ILogger _logger; public NoOpEventPublisher(ILogger logger) { _logger = logger; } public Task PublishRiskAssessmentAsync(RiskEvaluationRequest request, RiskEvaluationResult result) { _logger.LogDebug("CAP publisher not configured, skipping RiskAssessmentEvent"); return Task.CompletedTask; } public Task PublishRiskAlertAsync(RiskEvaluationRequest request, RiskEvaluationResult result) { _logger.LogDebug("CAP publisher not configured, skipping RiskAlertEvent"); return Task.CompletedTask; } }