using System;
using System.Collections.Generic;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
using StellaOps.Cryptography;
namespace StellaOps.Cryptography.DependencyInjection;
///
/// Dependency injection helpers for registering StellaOps cryptography services.
///
public static class CryptoServiceCollectionExtensions
{
///
/// Registers the default crypto provider and registry.
///
/// Service collection.
/// Optional registry ordering configuration.
/// Optional provider-level configuration (e.g. key registration).
/// The service collection.
public static IServiceCollection AddStellaOpsCrypto(
this IServiceCollection services,
Action? configureRegistry = null,
Action? configureProvider = null)
{
ArgumentNullException.ThrowIfNull(services);
if (configureRegistry is not null)
{
services.Configure(configureRegistry);
}
services.TryAddSingleton(sp =>
{
var provider = new DefaultCryptoProvider();
configureProvider?.Invoke(provider);
return provider;
});
services.TryAddEnumerable(ServiceDescriptor.Singleton());
#if STELLAOPS_CRYPTO_SODIUM
services.TryAddSingleton();
services.TryAddEnumerable(ServiceDescriptor.Singleton());
#endif
services.TryAddSingleton(sp =>
{
var providers = sp.GetServices();
var options = sp.GetService>();
IEnumerable? preferred = options?.Value?.PreferredProviders;
return new CryptoProviderRegistry(providers, preferred);
});
return services;
}
}