在ASP.NET MVC 6 FilterAttribute内依赖注入 [英] Dependency injection inside a FilterAttribute in ASP.NET MVC 6
问题描述
我的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
属性是一个空引用。同样的DI p>
Doing the same DI within BasicAuthenticationFilter
does 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屋!