From bd47b72077dc7a78b9e866995408a9ec3684cfc6 Mon Sep 17 00:00:00 2001 From: hassa Date: Wed, 2 Apr 2025 20:07:45 +0330 Subject: [PATCH 1/2] fix dynamic sms providers in smsService and DI based Ismsprovider --- src/Notify/Features/Sms/Services/SmsService.cs | 14 +++++++------- src/Notify/Features/Sms/SmsFeatureConfigure.cs | 15 ++++++++++++--- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/Notify/Features/Sms/Services/SmsService.cs b/src/Notify/Features/Sms/Services/SmsService.cs index 3164ee8..8122d8d 100644 --- a/src/Notify/Features/Sms/Services/SmsService.cs +++ b/src/Notify/Features/Sms/Services/SmsService.cs @@ -1,18 +1,17 @@ namespace Notify.Features.Sms.Services; -public class SmsService(SmsDbContext dbContext, IServiceProvider serviceProvider) +public class SmsService(SmsDbContext dbContext, IServiceProvider serviceProvider , IEnumerable smsProviders) { private readonly SmsDbContext _dbContext = dbContext; private readonly IServiceProvider _serviceProvider = serviceProvider; + private readonly IEnumerable _smsProviders = smsProviders; + public async Task SendAsync(Guid messageId, string mobile, string message, CancellationToken cancellationToken) { - - foreach (var providerName in SmsConfiguration.Providers) + foreach (var smsProvider in _smsProviders) { - var provider = _serviceProvider.GetRequiredKeyedService(providerName); - - var referenceId = await provider.SendAsync(mobile, message, cancellationToken); + var referenceId = await smsProvider.SendAsync(mobile, message, cancellationToken); if (string.IsNullOrEmpty(referenceId)) { @@ -20,13 +19,14 @@ public async Task SendAsync(Guid messageId, string mobile, string message, Cance continue; } - var smsTrace = SmsTrace.Create(mobile, message, messageId, referenceId, provider.Name); + var smsTrace = SmsTrace.Create(mobile, message, messageId, referenceId, smsProvider.Name); await _dbContext.SmsTraces.AddAsync(smsTrace, cancellationToken); await _dbContext.SaveChangesAsync(cancellationToken); // end of try break; } + } public async Task InquiryAsync(SmsTrace message, CancellationToken cancellationToken = default) diff --git a/src/Notify/Features/Sms/SmsFeatureConfigure.cs b/src/Notify/Features/Sms/SmsFeatureConfigure.cs index f2c51c4..7063ac1 100644 --- a/src/Notify/Features/Sms/SmsFeatureConfigure.cs +++ b/src/Notify/Features/Sms/SmsFeatureConfigure.cs @@ -1,4 +1,6 @@ -namespace Notify.Features.Sms; +using System.Reflection; + +namespace Notify.Features.Sms; public static class SmsFeatureConfigure { @@ -7,8 +9,15 @@ public static IServiceCollection ConfigureSmsFeature(this IServiceCollection ser services.AddHostedService(); services.AddScoped(); - services.AddKeyedScoped("ProviderA"); - services.AddKeyedScoped("ProviderB"); + // IoC of ISmsProvider + // This is dynamic DI based on ISmsProvider + var smsProviderType = typeof(ISmsProvider); + var types = Assembly.GetExecutingAssembly().GetTypes() + .Where(t => smsProviderType.IsAssignableFrom(t) && t.IsClass && !t.IsAbstract); + foreach (var type in types) + services.AddScoped(smsProviderType, type); + // end + var appSettings = configuration.Get(); From 96b03549a949c2cdbbc8003ce6a6514b460480b9 Mon Sep 17 00:00:00 2001 From: hassa Date: Wed, 2 Apr 2025 21:11:52 +0330 Subject: [PATCH 2/2] fix inquiry in sms service --- src/Notify/Features/Sms/Services/SmsService.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Notify/Features/Sms/Services/SmsService.cs b/src/Notify/Features/Sms/Services/SmsService.cs index 8122d8d..e594e41 100644 --- a/src/Notify/Features/Sms/Services/SmsService.cs +++ b/src/Notify/Features/Sms/Services/SmsService.cs @@ -31,7 +31,9 @@ public async Task SendAsync(Guid messageId, string mobile, string message, Cance public async Task InquiryAsync(SmsTrace message, CancellationToken cancellationToken = default) { - var provider = _serviceProvider.GetRequiredKeyedService(message.Provider); + var provider = _smsProviders.FirstOrDefault(a => a.Name == message.Provider); + if (provider == null) + throw new Exception($"sms provider {message.Provider} not found use correct sms provider"); return await provider.IquiryAsync(message.RefrenceId, cancellationToken); } }