using Femto.Common.Infrastructure; using Femto.Common.Infrastructure.DbConnection; using Femto.Common.Infrastructure.Outbox; using MediatR; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Quartz; namespace Femto.Modules.Blog.Application; public static class BlogStartup { public static void InitializeBlogModule( this IServiceCollection rootContainer, string connectionString ) { var hostBuilder = Host.CreateDefaultBuilder(); hostBuilder.ConfigureServices(services => ConfigureServices(services, connectionString)); var host = hostBuilder.Build(); rootContainer.AddHostedService(services => new BlogApplication(host)); rootContainer.AddScoped(_ => new BlogModule(host)); } private static void ConfigureServices(this IServiceCollection services, string connectionString) { services.AddTransient(_ => new DbConnectionFactory(connectionString)); services.AddDbContext(builder => { builder.UseNpgsql( connectionString, o => { o.MapEnum("outbox_status"); } ); builder.UseSnakeCaseNamingConvention(); var loggerFactory = LoggerFactory.Create(b => { }); builder.UseLoggerFactory(loggerFactory); builder.EnableSensitiveDataLogging(); }); services.AddMediatR(c => { c.RegisterServicesFromAssembly(typeof(BlogStartup).Assembly); }); services.ConfigureDomainServices(); } }