在ASP.NET MVC 6 FilterAttribute内依赖注入 [英] Dependency injection inside a FilterAttribute in ASP.NET MVC 6

查看:1412
本文介绍了在ASP.NET MVC 6 FilterAttribute内依赖注入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的ASP.NET MVC 6(beta 4版本发布)奋力试图类型的控制器过滤器属性中注入一个服务 AuthorizationFilterAttribute

I'm struggling with ASP.NET MVC 6 (beta 4 release) trying to inject a service within a controller filter attribute of type AuthorizationFilterAttribute.

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

This is the service (it has another service injected)

public class UsersTableRepository
{
    private readonly NeurosgarContext _dbContext;

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

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

    //other stuff...
}

这是在启动类的ConfigureServices方法服务,使

This is the ConfigureServices method in Startup class for services enabling

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

        services.AddSingleton<NeurosgarContext>(a => NeurosgarContextFactory.GetContext());
        services.AddSingleton<UifTableRepository<Nazione>>();
        services.AddSingleton<UsersTableRepository>();
  }

一个简单的虚拟控制器上定义了两个过滤器。你可以看到用 [FromServices] 和它的作品。

A simple "dummy" controller with two filters defined on it. You can notice that I already done DI inside this controller by decorating the property with [FromServices]and it works.

[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();
    }
}

做在 BasicAuthenticationFilter一样不工作,并在运行时 UserRepository 属性是一个空引用。

Doing the same DI within BasicAuthenticationFilterdoes not work and at runtime UserRepository property is a null reference.

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);
            //}
        }
    }
    // ...
}

有关如何解决这个任何想法?

Any idea about how solve this?

推荐答案

从注​​入依赖到你的属性解释的此处。让你的属性被动,或者使你的属性的谦虚对象一个href=\"https://stackoverflow.com/questions/29915192/unity-property-injection-on-authorizeattribute/29916075#29916075\">here.

Refrain from injecting dependencies into your attributes as explained here. Make your attributes passive, or make your attribute a humble object as described here.

这篇关于在ASP.NET MVC 6 FilterAttribute内依赖注入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆