ASP.NET MVC 6中FilterAttribute内的依赖注入

Fab*_*llo 7 asp.net asp.net-mvc dependency-injection filter

我正在努力尝试在类型的控制器过滤器属性中注入服务的ASP.NET MVC 6(beta 4版本)AuthorizationFilterAttribute.

这是服务(它注入了另一项服务)

public class UsersTableRepository
{
    private readonly NeurosgarContext _dbContext;

    public UsersTableRepository(NeurosgarContext DbContext)
    {
        _dbContext = DbContext;
    }

    public ICollection<User> AllUsers
    {
        get
        {
            return _dbContext.Users.ToList();
        }
    }

    //other stuff...
}
Run Code Online (Sandbox Code Playgroud)

这是启动服务启用类中的ConfigureServices方法

  public void ConfigureServices(IServiceCollection services)
  {
        //...

        services.AddSingleton<NeurosgarContext>(a => NeurosgarContextFactory.GetContext());
        services.AddSingleton<UifTableRepository<Nazione>>();
        services.AddSingleton<UsersTableRepository>();
  }
Run Code Online (Sandbox Code Playgroud)

一个简单的"虚拟"控制器,上面定义了两个过滤器.您可以注意到我已经通过装饰属性在该控制器中完成了DI [FromServices]并且它可以工作.

[Route("[controller]")]
[BasicAuthenticationFilter(Order = 0)]
[BasicAuthorizationFilter("Admin", Order = 1)]
public class DummyController : Controller
{

    [FromServices]
    public UsersTableRepository UsersRepository { get; set; }

    // GET: /<controller>/
    [Route("[action]")]
    public IActionResult Index()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

在内部执行相同的DI BasicAuthenticationFilter不起作用,并且在运行时UserRepository属性是空引用.

public class BasicAuthenticationFilterAttribute : AuthorizationFilterAttribute
{
    [FromServices]
    public UsersTableRepository UsersRepository { get; set; }

    public override void OnAuthorization(AuthorizationContext filterContext)

    {
        if (!Authenticate(filterContext.HttpContext))
        {
            // 401 Response
            var result = new HttpUnauthorizedResult();
            // Add the header for Basic authentication require
            filterContext.HttpContext.Response.Headers.Append("WWW-Authenticate", "Basic");
            filterContext.Result = result;

            //if (!HasAllowAnonymous(context))
            //{
            //    base.Fail(context);
            //}
        }
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

有什么想法解决这个问题吗?

Ste*_*ven 8

从注入依赖到你的属性解释不要在这里.让你的属性的被动,或让你的属性的谦逊对象所描述这里.