首页 / 问答 / ASP.NET Core应用程序开发中如何在操作过滤器(Action Filter)实现服务的依赖注入?

ASP.NET Core应用程序开发中如何在操作过滤器(Action Filter)实现服务的依赖注入?

1

在ASP.NET Core的应用程序开发中,现需要实现一个基于ActionFilterAttribute的类EnsureUserLoggedIn,并在EnsureUserLoggedIn中通过依赖注入某些特定的服务接口,如下:

public class EnsureUserLoggedIn : ActionFilterAttribute
{
    private readonly ISessionService _sessionService;

    public EnsureUserLoggedIn(ISessionService sessionService)
    {
        _sessionService = sessionService;
    }

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        // 问题: _sessionService 始终为null
        if (_sessionService.LoggedInUser == null)
        {
            context.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
            context.Result = new JsonResult("Unauthorized");
        }
    }
}

Startup.cs 注入的服务为:

services.AddScoped<ISessionService, SessionService>();

控制器调用示例代码为:

[Route("api/issues"), EnsureUserLoggedIn]
public class IssueController : Controller
{
}

正如上面代码中的注释描述,其中过滤器中的_sessionService始终为null,说明依赖注入的服务实例并没有成功。

那么,在ASP.NET Core应用程序中,如何实现过滤器的服务依赖注入呢?

回复 [×]
提交评论
请输入评论内容

3 个回答

  • 1

    直接通过过滤器的执行上下文ActionExecutingContextcontext.HttpContext.RequestServices.GetService<ISessionService>()方法获取到已经注入的服务,如下:

    这时,你只需要在Startup.cs文件中注入需要的服务即可,而不必注入过滤器的依赖服务,Startup.cs的服务注入如下:

    Rector的个人主页

    Rector

    2020-01-08 回答

    • 0

      因为过滤器(filter)被作为ServiceType使用,所以它也需要在IoC框架中作为服务注入,所以也应该将EnsureUserLoggedInStartup.cs的IoC中注入服务,如下:

      在控制器把过滤器作为ServiceFilter来使用,示例代码如下:

      Rector的个人主页

      Rector

      2020-01-08 回答

      • 0

        实现一个IFilterFactory

        另外,在Startup.cs文件中添加刚才实现的全局过滤器AuthorizationFilterFactory,如下:

        Rector的个人主页

        Rector

        2020-01-08 回答

        我来回答