.Net Core use new ApplicationBuilder instead of IApplicationBuilder from configure

219 views Asked by At

I am attempting to create a "registry" so that just creating a new class implementing IServiceCollectionInitializer or IApplicationBuilderInitializer allows it to be loaded. Instead of having a giant start up class the registry would add those automatically.

My problem is I dont know how to make the app either use a new application builder or retrieve the the one given automatically without getting it from startup.

public class ServiceCollectionInitializerRegistry
    {
        private readonly IList<IServiceCollectionInitializer> _serviceCollectionInitializers;
        private readonly IServiceCollection _serviceCollection;
        private readonly IServiceProvider _serviceProvider;

        public ServiceCollectionInitializerRegistry(IServiceCollection serviceCollection)
        {
            _serviceCollectionInitializers = new List<IServiceCollectionInitializer>();
            _serviceCollection = serviceCollection;
            _serviceProvider = serviceCollection.BuildServiceProvider();
        }

        public ServiceCollectionInitializerRegistry WithInitializers(
            params IServiceCollectionInitializer[] initializers)
        {
            if (!initializers.Any())
            {
                return this;
            }

            foreach (var initializer in initializers)
            {
                _serviceCollectionInitializers.Add(initializer);
            }

            return this;
        }

        public ServiceCollectionInitializerRegistry WithAssemblyInitializers()
        {
            var assembly = Assembly.GetEntryAssembly();
            var initializerTypes =
                assembly.GetTypes()
                    .Where(type => typeof(IServiceCollectionInitializer).IsAssignableFrom(type));

            if (!initializerTypes.Any())
            {
                return this;
            }

            foreach (var type in initializerTypes)
            {
                _serviceCollectionInitializers.Add((IServiceCollectionInitializer)Activator.CreateInstance(type));
            }

            return this;
        }

        public void Build()
        {
            var configuration = _serviceProvider.GetRequiredService<IConfiguration>();
            foreach (var serviceCollectionInitializer in _serviceCollectionInitializers)
            {
                var logger = _serviceProvider.GetRequiredService<ILoggerProvider>()
                    .CreateLogger(serviceCollectionInitializer.GetType().AssemblyQualifiedName);
                serviceCollectionInitializer
                    .Initialize(
                        configuration,
                        _serviceCollection, logger);
            }
        }
    }
public class ExceptionHandlingInitializer : IServiceCollectionInitializer, IApplicationBuilderInitializer
    {
        public void Initialize(IConfiguration configuration, IServiceCollection services, ILogger logger)
        {
            services.AddSingleton<IExceptionMapper, ExceptionMapper>();
            services.AddSingleton<IExceptionHandler, ExceptionHandler>();
        }

        public void Initialize(IConfiguration configuration, IApplicationBuilder builder, ILoggerFactory loggerFactory)
        {
            builder.UseExceptionHandlerMiddleware();
        }
    }
0

There are 0 answers