内容目录
在 ControllerBase 中,其 HttpContext 的默认为空。
这些属性依赖于 ControllerContext。
当然我们也可以注入 IHttpContextAccessor,在每个控制器的构造函数中写进去,比较麻烦。我可以统一通过 控制器激活器进行统一注入。
/// <summary>
/// Controller 激活器
/// </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)
{
}
}
在 Startup 中,修改依赖注入:
services.AddControllers()
.AddControllersAsServices();
services.Replace(ServiceDescriptor.Transient<IControllerActivator, ControllerActivator>()); //替换默认 Controller 激活器
文章评论