Ich habe Probleme mit ASP.NET MVC 6 (Beta 4-Version) versucht, einen Dienst innerhalb eines Controller-Filter-Attributs des Typs AuthorizationFilterAttribute
zu injizieren.Dependency-Injektion in einem FilterAttribute in ASP.NET MVC 6
Dies ist der Dienst (es ein anderer Dienst injiziert wurde)
public class UsersTableRepository
{
private readonly NeurosgarContext _dbContext;
public UsersTableRepository(NeurosgarContext DbContext)
{
_dbContext = DbContext;
}
public ICollection<User> AllUsers
{
get
{
return _dbContext.Users.ToList();
}
}
//other stuff...
}
Dies ist die ConfigureServices Methode in Startup-Klasse für Dienste
public void ConfigureServices(IServiceCollection services)
{
//...
services.AddSingleton<NeurosgarContext>(a => NeurosgarContextFactory.GetContext());
services.AddSingleton<UifTableRepository<Nazione>>();
services.AddSingleton<UsersTableRepository>();
}
Ein einfaches „dummy“ Regler mit zwei Filtern ermöglicht definiert darauf. Sie können feststellen, dass ich bereits DI in diesem Controller getan habe, indem Sie die Eigenschaft mit [FromServices]
verzieren und es funktioniert.
[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();
}
}
innerhalb BasicAuthenticationFilter
die gleichen DI Doing nicht funktioniert und zur Laufzeit UserRepository
Eigenschaft ist ein NULL-Verweis.
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);
//}
}
}
// ...
}
Irgendeine Idee darüber, wie das zu lösen?
Das Problem ist, dass, wenn ich einen Konstruktor im Filter verwenden, um den Dienst zu injizieren, ich die Attributinstanz nicht abfangen kann. –
Das liegt daran, dass Sie keine Abhängigkeiten in Ihre Attribute einfügen sollten. Bitte lesen Sie die referenzierten Artikel genau. – Steven
Danke. Ich werde es tun! –