| File: Controllers\DefaultControllerActivator.cs | Web Access |
| Project: src\aspnetcore\src\Mvc\Mvc.Core\src\Microsoft.AspNetCore.Mvc.Core.csproj (Microsoft.AspNetCore.Mvc.Core) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using Microsoft.AspNetCore.Mvc.Core; using Microsoft.AspNetCore.Mvc.Infrastructure; namespace Microsoft.AspNetCore.Mvc.Controllers; /// <summary> /// <see cref="IControllerActivator"/> that uses type activation to create controllers. /// </summary> internal sealed class DefaultControllerActivator : IControllerActivator { private readonly ITypeActivatorCache _typeActivatorCache; /// <summary> /// Creates a new <see cref="DefaultControllerActivator"/>. /// </summary> /// <param name="typeActivatorCache">The <see cref="ITypeActivatorCache"/>.</param> public DefaultControllerActivator(ITypeActivatorCache typeActivatorCache) { ArgumentNullException.ThrowIfNull(typeActivatorCache); _typeActivatorCache = typeActivatorCache; } /// <inheritdoc /> public object Create(ControllerContext controllerContext) { ArgumentNullException.ThrowIfNull(controllerContext); if (controllerContext.ActionDescriptor == null) { throw new ArgumentException(Resources.FormatPropertyOfTypeCannotBeNull( nameof(ControllerContext.ActionDescriptor), nameof(ControllerContext))); } var controllerTypeInfo = controllerContext.ActionDescriptor.ControllerTypeInfo; if (controllerTypeInfo == null) { throw new ArgumentException(Resources.FormatPropertyOfTypeCannotBeNull( nameof(controllerContext.ActionDescriptor.ControllerTypeInfo), nameof(ControllerContext.ActionDescriptor))); } var serviceProvider = controllerContext.HttpContext.RequestServices; return _typeActivatorCache.CreateInstance<object>(serviceProvider, controllerTypeInfo.AsType()); } /// <inheritdoc /> public void Release(ControllerContext context, object controller) { ArgumentNullException.ThrowIfNull(context); ArgumentNullException.ThrowIfNull(controller); if (controller is IDisposable disposable) { disposable.Dispose(); } } public ValueTask ReleaseAsync(ControllerContext context, object controller) { ArgumentNullException.ThrowIfNull(context); ArgumentNullException.ThrowIfNull(controller); if (controller is IAsyncDisposable asyncDisposable) { return asyncDisposable.DisposeAsync(); } Release(context, controller); return default; } }