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;
}