File: Internal\ConfigureContainerBuilder.cs
Web Access
Project: src\src\Hosting\Hosting\src\Microsoft.AspNetCore.Hosting.csproj (Microsoft.AspNetCore.Hosting)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Diagnostics;
using System.Reflection;
 
namespace Microsoft.AspNetCore.Hosting;
 
internal sealed class ConfigureContainerBuilder
{
    public ConfigureContainerBuilder(MethodInfo? configureContainerMethod)
    {
        MethodInfo = configureContainerMethod;
    }
 
    public MethodInfo? MethodInfo { get; }
 
    public Func<Action<object>, Action<object>> ConfigureContainerFilters { get; set; } = f => f;
 
    public Action<object> Build(object instance) => container => Invoke(instance, container);
 
    public Type GetContainerType()
    {
        Debug.Assert(MethodInfo != null, "Shouldn't be called when there is no Configure method.");
 
        var parameters = MethodInfo.GetParameters();
        if (parameters.Length != 1)
        {
            // REVIEW: This might be a breaking change
            throw new InvalidOperationException($"The {MethodInfo.Name} method must take only one parameter.");
        }
        return parameters[0].ParameterType;
    }
 
    private void Invoke(object instance, object container)
    {
        ConfigureContainerFilters(StartupConfigureContainer)(container);
 
        void StartupConfigureContainer(object containerBuilder) => InvokeCore(instance, containerBuilder);
    }
 
    private void InvokeCore(object instance, object container)
    {
        if (MethodInfo == null)
        {
            return;
        }
 
        var arguments = new object[1] { container };
 
        MethodInfo.InvokeWithoutWrappingExceptions(instance, arguments);
    }
}