public void Register(ServiceProviderHolder serviceProviderHolder)
        {
            var logger = serviceProviderHolder.ServiceProvider.GetRequiredService <ILogger>();

            ViewAssemblyLoader.LoadViewAssemblies(logger);

            var assemblies = new List <Assembly>();

            var builder = serviceProviderHolder.ServiceCollection.AddMvc()
                          .AddApplicationPart(typeof(TestController).Assembly);

            var loaded = AppDomain.CurrentDomain.GetAssemblies().Where(assembly =>
                                                                       !assembly.IsDynamic &&
                                                                       !assembly.GetName().Name !.StartsWith("Microsoft") &&
                                                                       assembly.GetName().Name !.Contains("Views", StringComparison.OrdinalIgnoreCase)).ToArray();

            assemblies.AddRange(loaded);

            logger.Information("Found view assemblies: {Count}", assemblies.Count);

            foreach (var assembly in assemblies)
            {
                logger.Information("Found view assembly: {Assembly}", assembly.GetName().Name);

                builder.AddApplicationPart(assembly);
            }
        }
        public static IServiceCollection AddDeploymentMvc(this IServiceCollection services,
                                                          EnvironmentConfiguration environmentConfiguration,
                                                          IKeyValueConfiguration configuration,
                                                          ILogger logger,
                                                          IApplicationAssemblyResolver applicationAssemblyResolver)
        {
            ViewAssemblyLoader.LoadViewAssemblies(logger);
            var         filteredAssemblies = applicationAssemblyResolver.GetAssemblies();
            IMvcBuilder mvcBuilder         = services.AddMvc(
                options =>
            {
                options.InputFormatters.Insert(0, new XWwwFormUrlEncodedFormatter());
                options.Filters.Add <ModelValidatorFilterAttribute>();
            })
                                             .AddNewtonsoftJson(
                options =>
            {
                options.SerializerSettings.Converters.Add(new DateConverter());
                options.SerializerSettings.Formatting = Formatting.Indented;
            });

            foreach (Assembly filteredAssembly in filteredAssemblies)
            {
                logger.Debug("Adding assembly {Assembly} to MVC application parts", filteredAssembly.FullName);
                mvcBuilder.AddApplicationPart(filteredAssembly);
            }

            var viewAssemblies = AssemblyLoadContext.Default.Assemblies
                                 .Where(assembly => !assembly.IsDynamic && (assembly.GetName().Name?.Contains("View") ?? false))
                                 .ToArray();

            foreach (var item in viewAssemblies)
            {
                mvcBuilder.AddApplicationPart(item);
            }

            if (environmentConfiguration.ToHostEnvironment().IsDevelopment() ||
                configuration.ValueOrDefault(StartupConstants.RuntimeCompilationEnabled))
            {
                mvcBuilder.AddRazorRuntimeCompilation();
            }

            mvcBuilder
            .AddControllersAsServices();

            services.AddAntiforgery();

            return(services);
        }