我试图将服务注入到动作过滤器中,但是没有在构造函数中注入所需的服务。这是我所拥有的:
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
{
}
Startup.cs
services.AddScoped<ISessionService, SessionService>();
使用这些文章作为参考:
ASP.NET 5和MVC 6中的动作筛选器,服务筛选器和类型筛选器
将过滤器用作ServiceFilter
由于过滤器将用作ServiceType
,因此需要向框架IoC注册。如果直接使用动作过滤器,则不需要这样做。
Startup.cs
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(){...}
}
还有其他的例子
使用过滤器作为全局过滤器
将过滤器与基本控制器一起使用
通过订单使用过滤器
看一看,尝试一下,看看是否可以解决您的问题。
希望这可以帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句