Custom Controller Activator in ASP.NET Core

2021年7月12日 56点热度 0人点赞 0条评论
内容目录

In ControllerBase, its HttpContext is null by default.

file

These properties depend on ControllerContext.

file

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

痴者工良

高级程序员劝退师

文章评论