diff --git a/src/Notify/Features/Sms/Services/SmsService.cs b/src/Notify/Features/Sms/Services/SmsService.cs index 3164ee8..e594e41 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,18 +19,21 @@ 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) { - 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); } } 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();