我试图将服务注入到动作过滤器中,但是没有将所需的服务注入构造函数中。这是我所拥有的:
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>();
使用这些文章作为参考:
ASP.NET核心操作筛选器
ASP.NET 5和MVC 6中的动作筛选器,服务筛选器和类型筛选器
将过滤器用作ServiceFilter
由于过滤器将用作ServiceType,因此需要向框架IoC注册。如果直接使用动作过滤器,则不需要这样做。
ServiceType
public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddScoped<ISessionService, SessionService>(); services.AddScoped<EnsureUserLoggedIn>(); ... }
使用ServiceFilter属性将自定义过滤器添加到MVC控制器方法和控制器类中,如下所示:
ServiceFilter
[ServiceFilter(typeof(EnsureUserLoggedIn))] [Route("api/issues")] public class IssueController : Controller { // GET: api/issues [HttpGet] [ServiceFilter(typeof(EnsureUserLoggedIn))] public IEnumerable<string> Get(){...} }
还有其他例子
使用过滤器作为全局过滤器
将过滤器与基本控制器一起使用
通过订单使用过滤器
看一看,尝试一下,看看是否可以解决您的问题。
希望这可以帮助。