using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using EnvelopeGenerator.Application;
using EnvelopeGenerator.Application.Common.Interfaces.Services;
using EnvelopeGenerator.Application.Services;
using EnvelopeGenerator.Infrastructure;
namespace EnvelopeGenerator.DependencyInjection;
///
/// Extension methods for registering EnvelopeGenerator services into an .
/// Use as the single entry-point for projects that need both the
/// application layer (MediatR, AutoMapper, CRUD services, configuration sections) and the infrastructure
/// layer (repositories, DbContext, SQL executors).
/// For projects that do not need a database (e.g. lightweight API gateways or unit-test hosts), use
/// to register only the application layer.
///
public static class DependencyInjection
{
///
/// Registers the full EnvelopeGenerator stack – application and infrastructure services – into
/// the provided .
///
/// Internally this calls AddEnvelopeGeneratorServices (application layer) and
/// AddEnvelopeGeneratorInfrastructureServices (infrastructure layer).
/// A and / or DbTriggerParams must be
/// configured through ; without it no database connection will
/// be established at runtime.
///
///
/// Service collection to register services into.
///
/// Application configuration. Used to bind DispatcherParams, MailParams,
/// AuthenticatorParams, TotpSmsParams, GtxMessagingParams and other
/// application-level option sections.
///
///
/// Optional callback to configure the infrastructure layer registration.
/// Typical usage:
///
/// services.AddEnvelopeGenerator(config, opt =>
/// {
/// opt.AddDbContext(o => o.UseSqlServer(connectionString));
/// opt.AddDbTriggerParams(config);
/// });
///
///
/// The updated .
#pragma warning disable CS0618 // AddEnvelopeGeneratorServices / AddEnvelopeGeneratorInfrastructureServices are intentionally wrapped here
public static IServiceCollection AddEnvelopeGenerator(
this IServiceCollection services,
IConfiguration configuration,
Action? infrastructureOptions = null)
{
// Application layer: CRUD services, MediatR, AutoMapper, configuration sections.
services.AddEnvelopeGeneratorServices(configuration);
// Infrastructure layer: repositories, DbContext, Dapper type maps, SQL executors.
services.AddEnvelopeGeneratorInfrastructureServices(opt =>
{
infrastructureOptions?.Invoke(opt);
});
return services;
}
#pragma warning restore CS0618
///
/// Registers only the application layer services (MediatR handlers, AutoMapper profiles,
/// CRUD services, configuration sections) without any infrastructure / database dependencies.
///
/// Useful for projects that already manage their own DbContext or do not require direct database
/// access, such as lightweight API gateways, console tools or unit/integration test hosts that
/// use an in-memory database configured elsewhere.
///
///
/// Service collection to register services into.
/// Application configuration used to bind application-level option sections.
/// The updated .
#pragma warning disable CS0618
public static IServiceCollection AddEnvelopeGeneratorCore(
this IServiceCollection services,
IConfiguration configuration)
{
services.AddEnvelopeGeneratorServices(configuration);
return services;
}
#pragma warning restore CS0618
///
/// Registers as the scoped
/// implementation.
///
/// Call this in addition to when the consuming project needs to
/// send envelope e-mails directly (e.g. a Worker Service or the Web project). Projects that rely
/// purely on MediatR commands to trigger mail delivery do not need to call this.
///
///
/// Service collection to register services into.
/// The updated .
#pragma warning disable CS0618
public static IServiceCollection AddEnvelopeMailService(this IServiceCollection services)
{
services.AddScoped();
return services;
}
#pragma warning restore CS0618
}