using Esiur.Protocol; using Esiur.Resource; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; namespace Esiur.AspNetCore; /// Registers Esiur with the ASP.NET Core dependency injection container. public static class EsiurServiceCollectionExtensions { /// Adds one host-managed Esiur runtime. public static EsiurBuilder AddEsiur(this IServiceCollection services) { ArgumentNullException.ThrowIfNull(services); if (services.Any(descriptor => descriptor.ServiceType == typeof(EsiurRegistrationMarker))) { throw new InvalidOperationException( "Esiur has already been added to this service collection."); } services.AddSingleton(); services.AddOptions().ValidateOnStart(); services.TryAddEnumerable( ServiceDescriptor.Singleton, EsiurOptionsPostConfigure>()); services.TryAddEnumerable( ServiceDescriptor.Singleton, EsiurOptionsValidator>()); services.AddSingleton(); services.AddSingleton(provider => provider.GetRequiredService().Warehouse); services.AddSingleton(provider => provider.GetRequiredService().Server); services.AddSingleton(); services.AddSingleton(); return new EsiurBuilder(services); } /// Adds and configures one host-managed Esiur runtime. public static EsiurBuilder AddEsiur( this IServiceCollection services, Action configure) { ArgumentNullException.ThrowIfNull(configure); var builder = services.AddEsiur(); configure(builder); return builder; } /// Adds Esiur around an existing Warehouse and EP server. public static EsiurBuilder AddEsiur( this IServiceCollection services, Warehouse warehouse, EpServer server, bool manageWarehouseLifecycle = true) => services.AddEsiur() .UseWarehouse(warehouse, manageWarehouseLifecycle) .UseServer(server); private sealed class EsiurRegistrationMarker; }