using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Prefab.Catalog.Data; using Prefab.Catalog.Data.Services; using Prefab.Catalog.Domain.Services; using Prefab.Data.Seeder; using Prefab.Module; using Prefab.Shared; using Prefab.Shared.Catalog; using Prefab.Shared.Catalog.Categories; using Prefab.Shared.Catalog.Products; namespace Prefab.Catalog; public class Module : IModule { public WebApplicationBuilder Build(WebApplicationBuilder builder) { builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSeeder(RunMode.RunAlways); ConfigureModuleClient(builder); return builder; } public WebApplication Configure(WebApplication app) => app; private static void ConfigureModuleClient(WebApplicationBuilder builder) { builder.Services.AddOptions().Configure((options, configuration) => { configuration.GetSection("Prefab:Catalog:Client").Bind(options); }); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddHttpClient((sp, client) => { var options = sp.GetRequiredService>().Value; var baseAddress = options.BaseAddress ?? new Uri("http://prefab-catalog"); client.BaseAddress = baseAddress; }); builder.Services.AddHttpClient((sp, client) => { var options = sp.GetRequiredService>().Value; var baseAddress = options.BaseAddress ?? new Uri("http://prefab-catalog"); client.BaseAddress = baseAddress; }); builder.Services.AddScoped(sp => { var options = sp.GetRequiredService>().Value; if (options.Transport == ModuleClientTransport.Http) { var categoryClient = sp.GetRequiredService(); var productClient = sp.GetRequiredService(); return new ModuleClientHttp(categoryClient, productClient, productClient); } var inProcessCategory = sp.GetRequiredService(); var inProcessProduct = sp.GetRequiredService(); return new ModuleClient(inProcessCategory, inProcessProduct, inProcessProduct); }); builder.Services.AddScoped(sp => sp.GetRequiredService().Category); builder.Services.AddScoped(sp => sp.GetRequiredService().Product); builder.Services.AddScoped(sp => sp.GetRequiredService().PriceQuote); } }