内容目录
In ControllerBase, its HttpContext is null by default.
These properties depend on ControllerContext.
Of course, we can also inject IHttpContextAccessor into the constructor of each controller, but that can be cumbersome. I can unify the injection through the controller activator.
/// <summary>
/// Controller activator
/// </summary>
public class ControllerActivator : IControllerActivator
{
private readonly IHttpContextAccessor _httpContextAccessor;
public ControllerActivator(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public object Create(ControllerContext context)
{
if(context==null)
{
throw new ArgumentNullException(nameof(context));
}
var controllerTyoe = context.ActionDescriptor.ControllerTypeInfo.AsType();
var controller = context.HttpContext
.RequestServices.GetRequiredService(controllerTyoe);
if(controller is ControllerCore controllerCore)
{
controllerCore.ControllerContext = context;
}
return controller;
}
public void Release(ControllerContext context, object controller)
{
}
}
In Startup, modify the dependency injection:
services.AddControllers()
.AddControllersAsServices();
services.Replace(ServiceDescriptor.Transient<IControllerActivator, ControllerActivator>()); // Replace the default controller activator
文章评论