using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Slim; using System.Configuration; using System.DependencyInjection.Http; using System.Http; using System.Logging; using System.Net.Http; namespace System.Extensions; public static class ServiceManagerExtensions { /// /// Registers a with the default . /// This call also registers the resolver that resolves and . /// /// . /// Provided . public static IServiceProducer RegisterOptionsManager(this IServiceProducer serviceProducer) { serviceProducer.ThrowIfNull(nameof(serviceProducer)); serviceProducer.RegisterSingleton(); serviceProducer.RegisterOptionsResolver(); return serviceProducer; } /// /// Registers a . /// This call also registers the resolver that resolves and . /// /// Implementation of . /// . /// Provided . public static IServiceProducer RegisterOptionsManager(this IServiceProducer serviceProducer) where T : IOptionsManager { serviceProducer.ThrowIfNull(nameof(serviceProducer)); serviceProducer.RegisterSingleton(); serviceProducer.RegisterOptionsResolver(); return serviceProducer; } /// /// Registers resolvers for and . /// Depends on a in order to properly resolve options. /// /// . /// . public static IServiceProducer RegisterOptionsResolver(this IServiceProducer serviceProducer) { serviceProducer.ThrowIfNull(nameof(serviceProducer)); serviceProducer.RegisterResolver(new OptionsResolver()); serviceProducer.RegisterResolver(new UpdateableOptionsResolver()); serviceProducer.RegisterResolver(new LiveOptionsResolver()); serviceProducer.RegisterResolver(new LiveUpdateableOptionsResolver()); return serviceProducer; } /// /// Registers a with the default . /// /// Implementation of . /// . /// Provided . public static IServiceProducer RegisterLogWriter(this IServiceProducer serviceManager) where TLogsWriter : ILogsWriter { serviceManager.ThrowIfNull(nameof(serviceManager)); serviceManager.RegisterSingleton(); serviceManager.RegisterScoped(sp => { var factory = new LoggerFactory(); factory.AddProvider(new CVLoggerProvider(sp.GetService())); return factory; }); return serviceManager; } /// /// Registers a with the default . /// /// Interface of . /// Implementation of . /// . /// Provided . public static IServiceProducer RegisterLogWriter(this IServiceProducer serviceManager) where TLogsWriter : TILogsWriter where TILogsWriter : class, ILogsWriter { serviceManager.ThrowIfNull(nameof(serviceManager)); serviceManager.RegisterSingleton(); serviceManager.RegisterScoped(sp => { var factory = new LoggerFactory(); factory.AddProvider(new CVLoggerProvider(sp.GetService())); return factory; }); return serviceManager; } /// /// Register a with a . /// /// /// public static IServiceProducer RegisterCVLoggerFactory(this IServiceProducer serviceProducer) { serviceProducer.ThrowIfNull(nameof(serviceProducer)); serviceProducer.RegisterScoped(sp => { LoggerFactory loggerFactory = new(); loggerFactory.AddProvider(new CVLoggerProvider(sp.GetService())); return loggerFactory; }); return serviceProducer; } /// /// Registers a . /// /// . /// Factory that produces a . /// public static IServiceProducer RegisterLoggerFactory(this IServiceProducer serviceProducer, Func loggerFactory) { serviceProducer.ThrowIfNull(nameof(serviceProducer)); serviceProducer.RegisterSingleton(loggerFactory); return serviceProducer; } /// /// Registers a with a that writes to . /// /// . /// public static IServiceProducer RegisterDebugLoggerFactory(this IServiceProducer serviceProducer) { serviceProducer.ThrowIfNull(nameof(serviceProducer)); serviceProducer.RegisterLogWriter(); return serviceProducer; } /// /// Register a scoped to be used by the DI engine. /// /// Type of the scoped . /// . /// to build the http client. public static HttpClientBuilder RegisterHttpClient(this IServiceProducer serviceProducer) { serviceProducer.ThrowIfNull(nameof(serviceProducer)); return new HttpClientBuilder(serviceProducer); } [Obsolete($"{nameof(RegisterHttpFactory)} is obsolete. Please use {nameof(RegisterHttpClient)} for each service that requires an instance of {nameof(IHttpClient)}.")] public static IServiceProducer RegisterHttpFactory(this IServiceProducer serviceProducer) { serviceProducer.ThrowIfNull(nameof(serviceProducer)); serviceProducer.RegisterResolver(new HttpClientResolver()); return serviceProducer; } [Obsolete($"{nameof(RegisterHttpFactory)} is obsolete. Please use {nameof(RegisterHttpClient)} for each service that requires an instance of {nameof(IHttpClient)}.")] public static IServiceProducer RegisterHttpFactory(this IServiceProducer serviceProducer, Func handlerFactory) { serviceProducer.ThrowIfNull(nameof(serviceProducer)); serviceProducer.RegisterResolver( new HttpClientResolver() .WithHttpMessageHandlerFactory(handlerFactory)); return serviceProducer; } }