| File: Internal\ConfigureContainerBuilder.cs | Web Access |
| Project: src\aspnetcore\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); } }