From 05612a240b7598e9d206afe167a55ce739c09eb3 Mon Sep 17 00:00:00 2001 From: spetz Date: Mon, 12 Sep 2022 11:02:12 +0200 Subject: [PATCH] Packages update, cleanup --- src/Modular.Abstractions/AppInfo.cs | 6 ++ src/Modular.Infrastructure/Api/Extensions.cs | 8 ++- src/Modular.Infrastructure/Auth/Extensions.cs | 16 ++++-- .../Cache/Extensions.cs | 9 ++- src/Modular.Infrastructure/Extensions.cs | 55 ++++++++++--------- .../Logging/Extensions.cs | 11 +--- .../Brokers/InMemoryMessageBroker.cs | 18 +++--- .../Messaging/Extensions.cs | 10 ++-- .../Messaging/Outbox/EfOutbox.cs | 11 ++-- .../Messaging/Outbox/Extensions.cs | 14 +++-- .../Messaging/Outbox/InboxCleanupProcessor.cs | 9 +-- .../Outbox/InboxEventHandlerDecorator.cs | 6 +- .../Messaging/Outbox/OutboxBroker.cs | 6 +- .../Outbox/OutboxCleanupProcessor.cs | 9 +-- .../Messaging/Outbox/OutboxProcessor.cs | 9 +-- .../Modular.Infrastructure.csproj | 12 ++-- .../Postgres/Extensions.cs | 11 ++-- .../Security/Extensions.cs | 8 ++- 18 files changed, 128 insertions(+), 100 deletions(-) create mode 100644 src/Modular.Abstractions/AppInfo.cs diff --git a/src/Modular.Abstractions/AppInfo.cs b/src/Modular.Abstractions/AppInfo.cs new file mode 100644 index 0000000..a853aa2 --- /dev/null +++ b/src/Modular.Abstractions/AppInfo.cs @@ -0,0 +1,6 @@ +namespace Modular.Abstractions; + +public record AppInfo(string Name, string Version) +{ + public override string ToString() => $"{Name} {Version}"; +} \ No newline at end of file diff --git a/src/Modular.Infrastructure/Api/Extensions.cs b/src/Modular.Infrastructure/Api/Extensions.cs index 86d70fb..7c46bf4 100644 --- a/src/Modular.Infrastructure/Api/Extensions.cs +++ b/src/Modular.Infrastructure/Api/Extensions.cs @@ -3,6 +3,7 @@ using System.Linq.Expressions; using System.Reflection; using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace Modular.Infrastructure.Api; @@ -39,12 +40,13 @@ private static TModel Bind(this TModel model, Expression("cors"); + var section = configuration.GetSection("cors"); + var corsOptions = section.GetOptions(); + services.Configure(section); return services - .AddSingleton(corsOptions) .AddCors(cors => { var allowedHeaders = corsOptions.AllowedHeaders ?? Enumerable.Empty(); diff --git a/src/Modular.Infrastructure/Auth/Extensions.cs b/src/Modular.Infrastructure/Auth/Extensions.cs index 2a26391..8a7a1fc 100644 --- a/src/Modular.Infrastructure/Auth/Extensions.cs +++ b/src/Modular.Infrastructure/Auth/Extensions.cs @@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Authorization.Policy; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; using Modular.Abstractions.Auth; @@ -17,13 +18,18 @@ namespace Modular.Infrastructure.Auth; public static class Extensions { + private const string SectionName = "auth"; private const string AccessTokenCookieName = "__access-token"; private const string AuthorizationHeader = "authorization"; - public static IServiceCollection AddAuth(this IServiceCollection services, IList modules = null, - Action optionsFactory = null) + public static IServiceCollection AddAuth(this IServiceCollection services, IConfiguration configuration, + IEnumerable modules = null, Action optionsFactory = null) { - var options = services.GetOptions("auth"); + var authSection = configuration.GetSection(SectionName); + var cookieSection = configuration.GetSection($"{SectionName}:cookie"); + var options = authSection.GetOptions(); + services.Configure(authSection); + services.Configure(cookieSection); services.AddSingleton(); if (options.AuthenticationDisabled) @@ -124,8 +130,6 @@ public static IServiceCollection AddAuth(this IServiceCollection services, IList optionsFactory?.Invoke(o); }); - services.AddSingleton(options); - services.AddSingleton(options.Cookie); services.AddSingleton(tokenValidationParameters); var policies = modules?.SelectMany(x => x.Policies ?? Enumerable.Empty()) ?? @@ -154,7 +158,7 @@ public static IApplicationBuilder UseAuth(this IApplicationBuilder app) if (ctx.Request.Cookies.ContainsKey(AccessTokenCookieName)) { var authenticateResult = await ctx.AuthenticateAsync(JwtBearerDefaults.AuthenticationScheme); - if (authenticateResult.Succeeded && authenticateResult.Principal is not null) + if (authenticateResult.Succeeded) { ctx.User = authenticateResult.Principal; } diff --git a/src/Modular.Infrastructure/Cache/Extensions.cs b/src/Modular.Infrastructure/Cache/Extensions.cs index 0f54d89..8ea0967 100644 --- a/src/Modular.Infrastructure/Cache/Extensions.cs +++ b/src/Modular.Infrastructure/Cache/Extensions.cs @@ -1,13 +1,16 @@ -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using StackExchange.Redis; namespace Modular.Infrastructure.Cache; public static class Extensions { - public static IServiceCollection AddRedisCache(this IServiceCollection services) + public static IServiceCollection AddRedisCache(this IServiceCollection services, IConfiguration configuration) { - var options = services.GetOptions("redis"); + var section = configuration.GetSection("redis"); + var options = section.GetOptions(); + services.Configure(section); services.AddStackExchangeRedisCache(o => o.Configuration = options.ConnectionString); services.AddScoped(); services.AddSingleton(ConnectionMultiplexer.Connect(options.ConnectionString)); diff --git a/src/Modular.Infrastructure/Extensions.cs b/src/Modular.Infrastructure/Extensions.cs index 4c03f08..1171d67 100644 --- a/src/Modular.Infrastructure/Extensions.cs +++ b/src/Modular.Infrastructure/Extensions.cs @@ -9,6 +9,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.OpenApi.Models; +using Modular.Abstractions; using Modular.Abstractions.Dispatchers; using Modular.Abstractions.Modules; using Modular.Abstractions.Storage; @@ -35,33 +36,30 @@ namespace Modular.Infrastructure; public static class Extensions { + private const string AppSectionName = "app"; private const string CorrelationIdKey = "correlation-id"; public static IServiceCollection AddInitializer(this IServiceCollection services) where T : class, IInitializer => services.AddTransient(); public static IServiceCollection AddModularInfrastructure(this IServiceCollection services, - IList assemblies, IList modules) + IConfiguration configuration, IList assemblies, IList modules) { var disabledModules = new List(); - using (var serviceProvider = services.BuildServiceProvider()) + foreach (var (key, value) in configuration.AsEnumerable()) { - var configuration = serviceProvider.GetRequiredService(); - foreach (var (key, value) in configuration.AsEnumerable()) + if (!key.Contains(":module:enabled")) { - if (!key.Contains(":module:enabled")) - { - continue; - } + continue; + } - if (!bool.Parse(value)) - { - disabledModules.Add(key.Split(":")[0]); - } + if (!bool.Parse(value)) + { + disabledModules.Add(key.Split(":")[0]); } } - services.AddCorsPolicy(); + services.AddCorsPolicy(configuration); services.AddSwaggerGen(swagger => { swagger.EnableAnnotations(); @@ -73,8 +71,12 @@ public static IServiceCollection AddModularInfrastructure(this IServiceCollectio }); }); - var appOptions = services.GetOptions("app"); - services.AddSingleton(appOptions); + var appOptionsSection = configuration.GetSection(AppSectionName); + services.Configure(appOptionsSection); + + var appOptions = configuration.GetAppOptions(); + var appInfo = new AppInfo(appOptions.Name, appOptions.Version); + services.AddSingleton(appInfo); services.AddMemoryCache(); services.AddHttpClient(); @@ -83,16 +85,16 @@ public static IServiceCollection AddModularInfrastructure(this IServiceCollectio services.AddSingleton(); services.AddModuleInfo(modules); services.AddModuleRequests(assemblies); - services.AddAuth(modules); + services.AddAuth(configuration, modules); services.AddErrorHandling(); services.AddContext(); services.AddCommands(assemblies); services.AddQueries(assemblies); services.AddEvents(assemblies); services.AddDomainEvents(assemblies); - services.AddMessaging(); - services.AddSecurity(); - services.AddOutbox(); + services.AddMessaging(configuration); + services.AddSecurity(configuration); + services.AddOutbox(configuration); services.AddSingleton(); services.AddSingleton(); services.AddControllers() @@ -142,17 +144,16 @@ public static IApplicationBuilder UseModularInfrastructure(this IApplicationBuil return app; } - public static T GetOptions(this IServiceCollection services, string sectionName) where T : new() - { - using var serviceProvider = services.BuildServiceProvider(); - var configuration = serviceProvider.GetRequiredService(); - return configuration.GetOptions(sectionName); - } - + public static AppOptions GetAppOptions(this IConfiguration configuration) + => configuration.GetOptions(AppSectionName); + public static T GetOptions(this IConfiguration configuration, string sectionName) where T : new() + => configuration.GetSection(sectionName).GetOptions(); + + public static T GetOptions(this IConfigurationSection section) where T : new() { var options = new T(); - configuration.GetSection(sectionName).Bind(options); + section.Bind(options); return options; } diff --git a/src/Modular.Infrastructure/Logging/Extensions.cs b/src/Modular.Infrastructure/Logging/Extensions.cs index 08af6bb..9832ba3 100644 --- a/src/Modular.Infrastructure/Logging/Extensions.cs +++ b/src/Modular.Infrastructure/Logging/Extensions.cs @@ -21,7 +21,6 @@ public static class Extensions { private const string ConsoleOutputTemplate = "{Timestamp:HH:mm:ss} [{Level:u3}] {Message}{NewLine}{Exception}"; private const string FileOutputTemplate = "{Timestamp:HH:mm:ss} [{Level:u3}] ({SourceContext}.{Method}) {Message}{NewLine}{Exception}"; - private const string AppSectionName = "app"; private const string LoggerSectionName = "logger"; public static IServiceCollection AddLoggingDecorators(this IServiceCollection services) @@ -52,8 +51,7 @@ public static IApplicationBuilder UseLogging(this IApplicationBuilder app) } public static IHostBuilder UseLogging(this IHostBuilder builder, Action configure = null, - string loggerSectionName = LoggerSectionName, - string appSectionName = AppSectionName) + string loggerSectionName = LoggerSectionName) => builder.UseSerilog((context, loggerConfiguration) => { if (string.IsNullOrWhiteSpace(loggerSectionName)) @@ -61,12 +59,7 @@ public static IHostBuilder UseLogging(this IHostBuilder builder, Action(appSectionName); + var appOptions = context.Configuration.GetAppOptions(); var loggerOptions = context.Configuration.GetOptions(loggerSectionName); MapOptions(loggerOptions, appOptions, loggerConfiguration, context.HostingEnvironment.EnvironmentName); diff --git a/src/Modular.Infrastructure/Messaging/Brokers/InMemoryMessageBroker.cs b/src/Modular.Infrastructure/Messaging/Brokers/InMemoryMessageBroker.cs index 7bec1db..bfeaabe 100644 --- a/src/Modular.Infrastructure/Messaging/Brokers/InMemoryMessageBroker.cs +++ b/src/Modular.Infrastructure/Messaging/Brokers/InMemoryMessageBroker.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using Humanizer; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Modular.Abstractions.Contexts; using Modular.Abstractions.Messaging; using Modular.Abstractions.Modules; @@ -20,19 +21,19 @@ public sealed class InMemoryMessageBroker : IMessageBroker private readonly IContext _context; private readonly IOutboxBroker _outboxBroker; private readonly IMessageContextRegistry _messageContextRegistry; - private readonly MessagingOptions _messagingOptions; + private readonly bool _useAsyncDispatcher; private readonly ILogger _logger; public InMemoryMessageBroker(IModuleClient moduleClient, IAsyncMessageDispatcher asyncMessageDispatcher, IContext context, IOutboxBroker outboxBroker, IMessageContextRegistry messageContextRegistry, - MessagingOptions messagingOptions,ILogger logger) + IOptions messagingOptions, ILogger logger) { _moduleClient = moduleClient; _asyncMessageDispatcher = asyncMessageDispatcher; _context = context; _outboxBroker = outboxBroker; _messageContextRegistry = messageContextRegistry; - _messagingOptions = messagingOptions; + _useAsyncDispatcher = messagingOptions.Value.UseAsyncDispatcher; _logger = logger; } @@ -41,7 +42,7 @@ public Task PublishAsync(IMessage message, CancellationToken cancellationToken = public Task PublishAsync(IMessage[] messages, CancellationToken cancellationToken = default) => PublishAsync(cancellationToken, messages); - + private async Task PublishAsync(CancellationToken cancellationToken, params IMessage[] messages) { if (messages is null) @@ -60,7 +61,7 @@ private async Task PublishAsync(CancellationToken cancellationToken, params IMes { var messageContext = new MessageContext(Guid.NewGuid(), _context); _messageContextRegistry.Set(message, messageContext); - + var module = message.GetModuleName(); var name = message.GetType().Name.Underscore(); var requestId = _context.RequestId; @@ -68,8 +69,9 @@ private async Task PublishAsync(CancellationToken cancellationToken, params IMes var userId = _context.Identity?.Id; var messageId = messageContext.MessageId; var correlationId = messageContext.Context.CorrelationId; - - _logger.LogInformation("Publishing a message: {Name} ({Module}) [Request ID: {RequestId}, Message ID: {MessageId}, Correlation ID: {CorrelationId}, Trace ID: '{TraceId}', User ID: '{UserId}]...", + + _logger.LogInformation( + "Publishing a message: {Name} ({Module}) [Request ID: {RequestId}, Message ID: {MessageId}, Correlation ID: {CorrelationId}, Trace ID: '{TraceId}', User ID: '{UserId}]...", name, module, requestId, messageId, correlationId, traceId, userId); } @@ -79,7 +81,7 @@ private async Task PublishAsync(CancellationToken cancellationToken, params IMes return; } - var tasks = _messagingOptions.UseAsyncDispatcher + var tasks = _useAsyncDispatcher ? messages.Select(message => _asyncMessageDispatcher.PublishAsync(message, cancellationToken)) : messages.Select(message => _moduleClient.PublishAsync(message, cancellationToken)); diff --git a/src/Modular.Infrastructure/Messaging/Extensions.cs b/src/Modular.Infrastructure/Messaging/Extensions.cs index 20a8804..bd1d17f 100644 --- a/src/Modular.Infrastructure/Messaging/Extensions.cs +++ b/src/Modular.Infrastructure/Messaging/Extensions.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Modular.Abstractions.Messaging; using Modular.Infrastructure.Messaging.Brokers; using Modular.Infrastructure.Messaging.Contexts; @@ -10,7 +11,7 @@ public static class Extensions { private const string SectionName = "messaging"; - public static IServiceCollection AddMessaging(this IServiceCollection services) + public static IServiceCollection AddMessaging(this IServiceCollection services, IConfiguration configuration) { services.AddTransient(); services.AddTransient(); @@ -18,8 +19,9 @@ public static IServiceCollection AddMessaging(this IServiceCollection services) services.AddSingleton(); services.AddSingleton(); - var messagingOptions = services.GetOptions(SectionName); - services.AddSingleton(messagingOptions); + var section = configuration.GetSection(SectionName); + var messagingOptions = section.GetOptions(); + services.Configure(section); if (messagingOptions.UseAsyncDispatcher) { diff --git a/src/Modular.Infrastructure/Messaging/Outbox/EfOutbox.cs b/src/Modular.Infrastructure/Messaging/Outbox/EfOutbox.cs index cb363c2..f83a158 100644 --- a/src/Modular.Infrastructure/Messaging/Outbox/EfOutbox.cs +++ b/src/Modular.Infrastructure/Messaging/Outbox/EfOutbox.cs @@ -4,6 +4,7 @@ using Humanizer; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Modular.Abstractions.Messaging; using Modular.Abstractions.Modules; using Modular.Abstractions.Time; @@ -24,15 +25,15 @@ public sealed class EfOutbox : IOutbox where T : DbContext private readonly IModuleClient _moduleClient; private readonly IAsyncMessageDispatcher _asyncMessageDispatcher; private readonly IJsonSerializer _jsonSerializer; - private readonly MessagingOptions _messagingOptions; private readonly ILogger> _logger; + private readonly bool _useAsyncDispatcher; public bool Enabled { get; } public EfOutbox(T dbContext, IMessageContextRegistry messageContextRegistry, IMessageContextProvider messageContextProvider, IClock clock, IModuleClient moduleClient, IAsyncMessageDispatcher asyncMessageDispatcher, IJsonSerializer jsonSerializer, - MessagingOptions messagingOptions, OutboxOptions outboxOptions, ILogger> logger) + IOptions messagingOptions, IOptions outboxOptions, ILogger> logger) { _dbContext = dbContext; _set = dbContext.Set(); @@ -42,9 +43,9 @@ public EfOutbox(T dbContext, IMessageContextRegistry messageContextRegistry, _moduleClient = moduleClient; _asyncMessageDispatcher = asyncMessageDispatcher; _jsonSerializer = jsonSerializer; - _messagingOptions = messagingOptions; + _useAsyncDispatcher = messagingOptions.Value.UseAsyncDispatcher; _logger = logger; - Enabled = outboxOptions.Enabled; + Enabled = outboxOptions.Value.Enabled; } public async Task SaveAsync(params IMessage[] messages) @@ -128,7 +129,7 @@ public async Task PublishUnsentAsync() _logger.LogInformation("Publishing a message from outbox ('{Module}'): {Name} [Message ID: {MessageId}, Correlation ID: {CorrelationId}]...", module, name, messageId, correlationId); - if (_messagingOptions.UseAsyncDispatcher) + if (_useAsyncDispatcher) { await _asyncMessageDispatcher.PublishAsync(message); } diff --git a/src/Modular.Infrastructure/Messaging/Outbox/Extensions.cs b/src/Modular.Infrastructure/Messaging/Outbox/Extensions.cs index f999f52..5f41dcd 100644 --- a/src/Modular.Infrastructure/Messaging/Outbox/Extensions.cs +++ b/src/Modular.Infrastructure/Messaging/Outbox/Extensions.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Modular.Abstractions.Events; @@ -6,9 +7,11 @@ namespace Modular.Infrastructure.Messaging.Outbox; public static class Extensions { - public static IServiceCollection AddOutbox(this IServiceCollection services) where T : DbContext + private const string SectionName = "outbox"; + + public static IServiceCollection AddOutbox(this IServiceCollection services, IConfiguration configuration) where T : DbContext { - var outboxOptions = services.GetOptions("outbox"); + var outboxOptions = configuration.GetOptions(SectionName); if (!outboxOptions.Enabled) { return services; @@ -26,10 +29,11 @@ public static IServiceCollection AddOutbox(this IServiceCollection services) return services; } - public static IServiceCollection AddOutbox(this IServiceCollection services) + public static IServiceCollection AddOutbox(this IServiceCollection services, IConfiguration configuration) { - var outboxOptions = services.GetOptions("outbox"); - services.AddSingleton(outboxOptions); + var section = configuration.GetSection(SectionName); + var outboxOptions = section.GetOptions(); + services.Configure(section); services.AddSingleton(new InboxTypeRegistry()); services.AddSingleton(new OutboxTypeRegistry()); services.AddSingleton(); diff --git a/src/Modular.Infrastructure/Messaging/Outbox/InboxCleanupProcessor.cs b/src/Modular.Infrastructure/Messaging/Outbox/InboxCleanupProcessor.cs index ac83708..06dde7f 100644 --- a/src/Modular.Infrastructure/Messaging/Outbox/InboxCleanupProcessor.cs +++ b/src/Modular.Infrastructure/Messaging/Outbox/InboxCleanupProcessor.cs @@ -6,6 +6,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Modular.Abstractions.Time; namespace Modular.Infrastructure.Messaging.Outbox; @@ -20,15 +21,15 @@ public class InboxCleanupProcessor : BackgroundService private readonly TimeSpan _startDelay; private int _isProcessing; - public InboxCleanupProcessor(IServiceScopeFactory serviceScopeFactory, OutboxOptions outboxOptions, + public InboxCleanupProcessor(IServiceScopeFactory serviceScopeFactory, IOptions outboxOptions, IClock clock, ILogger logger) { _serviceScopeFactory = serviceScopeFactory; _clock = clock; _logger = logger; - _enabled = outboxOptions.Enabled; - _interval = outboxOptions.InboxCleanupInterval ?? TimeSpan.FromHours(1); - _startDelay = outboxOptions.StartDelay ?? TimeSpan.FromSeconds(5); + _enabled = outboxOptions.Value.Enabled; + _interval = outboxOptions.Value.InboxCleanupInterval ?? TimeSpan.FromHours(1); + _startDelay = outboxOptions.Value.StartDelay ?? TimeSpan.FromSeconds(5); } protected override async Task ExecuteAsync(CancellationToken stoppingToken) diff --git a/src/Modular.Infrastructure/Messaging/Outbox/InboxEventHandlerDecorator.cs b/src/Modular.Infrastructure/Messaging/Outbox/InboxEventHandlerDecorator.cs index c188dcc..5c7c573 100644 --- a/src/Modular.Infrastructure/Messaging/Outbox/InboxEventHandlerDecorator.cs +++ b/src/Modular.Infrastructure/Messaging/Outbox/InboxEventHandlerDecorator.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using Humanizer; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Modular.Abstractions.Events; using Modular.Abstractions.Messaging; @@ -18,13 +19,14 @@ public class InboxEventHandlerDecorator : IEventHandler where T : class, I private readonly bool _enabled; public InboxEventHandlerDecorator(IEventHandler handler, IServiceProvider serviceProvider, - IMessageContextProvider messageContextProvider, InboxTypeRegistry inboxTypeRegistry, OutboxOptions options) + IMessageContextProvider messageContextProvider, InboxTypeRegistry inboxTypeRegistry, + IOptions options) { _handler = handler; _serviceProvider = serviceProvider; _messageContextProvider = messageContextProvider; _inboxTypeRegistry = inboxTypeRegistry; - _enabled = options.Enabled; + _enabled = options.Value.Enabled; } public async Task HandleAsync(T @event, CancellationToken cancellationToken = default) diff --git a/src/Modular.Infrastructure/Messaging/Outbox/OutboxBroker.cs b/src/Modular.Infrastructure/Messaging/Outbox/OutboxBroker.cs index 53c0747..6e1d919 100644 --- a/src/Modular.Infrastructure/Messaging/Outbox/OutboxBroker.cs +++ b/src/Modular.Infrastructure/Messaging/Outbox/OutboxBroker.cs @@ -1,6 +1,7 @@ using System; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Modular.Abstractions.Messaging; namespace Modular.Infrastructure.Messaging.Outbox; @@ -10,11 +11,12 @@ public class OutboxBroker : IOutboxBroker private readonly IServiceProvider _serviceProvider; private readonly OutboxTypeRegistry _registry; - public OutboxBroker(IServiceProvider serviceProvider, OutboxTypeRegistry registry, OutboxOptions options) + public OutboxBroker(IServiceProvider serviceProvider, OutboxTypeRegistry registry, + IOptions options) { _serviceProvider = serviceProvider; _registry = registry; - Enabled = options.Enabled; + Enabled = options.Value.Enabled; } public bool Enabled { get; } diff --git a/src/Modular.Infrastructure/Messaging/Outbox/OutboxCleanupProcessor.cs b/src/Modular.Infrastructure/Messaging/Outbox/OutboxCleanupProcessor.cs index 31456ca..be34e24 100644 --- a/src/Modular.Infrastructure/Messaging/Outbox/OutboxCleanupProcessor.cs +++ b/src/Modular.Infrastructure/Messaging/Outbox/OutboxCleanupProcessor.cs @@ -6,6 +6,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Modular.Abstractions.Time; namespace Modular.Infrastructure.Messaging.Outbox; @@ -20,15 +21,15 @@ public class OutboxCleanupProcessor : BackgroundService private readonly TimeSpan _startDelay; private int _isProcessing; - public OutboxCleanupProcessor(IServiceScopeFactory serviceScopeFactory, OutboxOptions outboxOptions, + public OutboxCleanupProcessor(IServiceScopeFactory serviceScopeFactory, IOptions outboxOptions, IClock clock, ILogger logger) { _serviceScopeFactory = serviceScopeFactory; _clock = clock; _logger = logger; - _enabled = outboxOptions.Enabled; - _interval = outboxOptions.OutboxCleanupInterval ?? TimeSpan.FromHours(1); - _startDelay = outboxOptions.StartDelay ?? TimeSpan.FromSeconds(5); + _enabled = outboxOptions.Value.Enabled; + _interval = outboxOptions.Value.OutboxCleanupInterval ?? TimeSpan.FromHours(1); + _startDelay = outboxOptions.Value.StartDelay ?? TimeSpan.FromSeconds(5); } protected override async Task ExecuteAsync(CancellationToken stoppingToken) diff --git a/src/Modular.Infrastructure/Messaging/Outbox/OutboxProcessor.cs b/src/Modular.Infrastructure/Messaging/Outbox/OutboxProcessor.cs index bd919ca..a83c259 100644 --- a/src/Modular.Infrastructure/Messaging/Outbox/OutboxProcessor.cs +++ b/src/Modular.Infrastructure/Messaging/Outbox/OutboxProcessor.cs @@ -6,6 +6,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; namespace Modular.Infrastructure.Messaging.Outbox; @@ -18,14 +19,14 @@ public class OutboxProcessor : BackgroundService private readonly TimeSpan _startDelay; private int _isProcessing; - public OutboxProcessor(IServiceScopeFactory serviceScopeFactory, OutboxOptions outboxOptions, + public OutboxProcessor(IServiceScopeFactory serviceScopeFactory, IOptions outboxOptions, ILogger logger) { _serviceScopeFactory = serviceScopeFactory; _logger = logger; - _enabled = outboxOptions.Enabled; - _interval = outboxOptions.Interval ?? TimeSpan.FromSeconds(1); - _startDelay = outboxOptions.StartDelay ?? TimeSpan.FromSeconds(5); + _enabled = outboxOptions.Value.Enabled; + _interval = outboxOptions.Value.Interval ?? TimeSpan.FromSeconds(1); + _startDelay = outboxOptions.Value.StartDelay ?? TimeSpan.FromSeconds(5); } protected override async Task ExecuteAsync(CancellationToken stoppingToken) diff --git a/src/Modular.Infrastructure/Modular.Infrastructure.csproj b/src/Modular.Infrastructure/Modular.Infrastructure.csproj index 008eb2c..26f00a9 100644 --- a/src/Modular.Infrastructure/Modular.Infrastructure.csproj +++ b/src/Modular.Infrastructure/Modular.Infrastructure.csproj @@ -11,16 +11,16 @@ - - - - - + + + + + - + diff --git a/src/Modular.Infrastructure/Postgres/Extensions.cs b/src/Modular.Infrastructure/Postgres/Extensions.cs index 8c38f85..54c9f75 100644 --- a/src/Modular.Infrastructure/Postgres/Extensions.cs +++ b/src/Modular.Infrastructure/Postgres/Extensions.cs @@ -4,6 +4,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Modular.Abstractions.Commands; using Modular.Abstractions.Events; @@ -62,10 +63,10 @@ public static async Task> SkipAndTakeAsync(this IQueryable data, i return await data.Skip((page - 1) * results).Take(results).ToListAsync(cancellationToken); } - public static IServiceCollection AddPostgres(this IServiceCollection services) + public static IServiceCollection AddPostgres(this IServiceCollection services, IConfiguration configuration) { - var options = services.GetOptions("postgres"); - services.AddSingleton(options); + var section = configuration.GetSection("postgres"); + services.Configure(section); services.AddSingleton(new UnitOfWorkTypeRegistry()); return services; @@ -79,9 +80,9 @@ public static IServiceCollection AddTransactionalDecorators(this IServiceCollect return services; } - public static IServiceCollection AddPostgres(this IServiceCollection services) where T : DbContext + public static IServiceCollection AddPostgres(this IServiceCollection services, IConfiguration configuration) where T : DbContext { - var options = services.GetOptions("postgres"); + var options = configuration.GetOptions("postgres"); services.AddDbContext(x => x.UseNpgsql(options.ConnectionString)); return services; diff --git a/src/Modular.Infrastructure/Security/Extensions.cs b/src/Modular.Infrastructure/Security/Extensions.cs index e1e717f..827c7ec 100644 --- a/src/Modular.Infrastructure/Security/Extensions.cs +++ b/src/Modular.Infrastructure/Security/Extensions.cs @@ -1,4 +1,5 @@ using System; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Modular.Infrastructure.Security.Encryption; @@ -7,9 +8,10 @@ namespace Modular.Infrastructure.Security; public static class Extensions { - public static IServiceCollection AddSecurity(this IServiceCollection services) + public static IServiceCollection AddSecurity(this IServiceCollection services, IConfiguration configuration) { - var securityOptions = services.GetOptions("security"); + var section = configuration.GetSection("security"); + var securityOptions = section.GetOptions(); using (var serviceProvider = services.BuildServiceProvider()) { var logger = serviceProvider.GetRequiredService>(); @@ -34,7 +36,7 @@ public static IServiceCollection AddSecurity(this IServiceCollection services) } return services - .AddSingleton(securityOptions) + .Configure(section) .AddSingleton() .AddSingleton() .AddSingleton()