一尘不染

将服务注入动作过滤器

c#

我试图将服务注入到动作过滤器中,但是没有将所需的服务注入构造函数中。这是我所拥有的:

public class EnsureUserLoggedIn : ActionFilterAttribute
{
    private readonly ISessionService _sessionService;

    public EnsureUserLoggedIn()
    {
        // I was unable able to remove the default ctor 
        // because of compilation error while using the 
        // attribute in my controller
    }

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

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        // Problem: _sessionService is null here
        if (_sessionService.LoggedInUser == null)
        {
            context.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
            context.Result = new JsonResult("Unauthorized");
        }
    }
}

我像这样装饰控制器:

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

启动文件

services.AddScoped<ISessionService, SessionService>();

阅读 287

收藏
2020-05-19

共1个答案

一尘不染

使用这些文章作为参考:

ASP.NET核心操作筛选器

ASP.NET 5和MVC 6中的动作筛选器,服务筛选器和类型筛选器

将过滤器用作ServiceFilter

由于过滤器将用作ServiceType,因此需要向框架IoC注册。如果直接使用动作过滤器,则不需要这样做。

启动文件

public void ConfigureServices(IServiceCollection services) {
    services.AddMvc();

    services.AddScoped<ISessionService, SessionService>();
    services.AddScoped<EnsureUserLoggedIn>();

    ...
}

使用ServiceFilter属性将自定义过滤器添加到MVC控制器方法和控制器类中,如下所示:

[ServiceFilter(typeof(EnsureUserLoggedIn))]
[Route("api/issues")]
public class IssueController : Controller {
    // GET: api/issues
    [HttpGet]
    [ServiceFilter(typeof(EnsureUserLoggedIn))]
    public IEnumerable<string> Get(){...}
}

还有其他例子

  • 使用过滤器作为全局过滤器

  • 将过滤器与基本控制器一起使用

  • 通过订单使用过滤器

看一看,尝试一下,看看是否可以解决您的问题。

希望这可以帮助。

2020-05-19