2015-05-07 4 views
6

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?

Antwort

7

Unterlassen Sie Abhängigkeiten in Ihre Attribute zu injizieren, wie erklärt here. Machen Sie Ihre attributes passive, oder machen Sie Ihr Attribut humble object wie beschrieben here.

+0

Das Problem ist, dass, wenn ich einen Konstruktor im Filter verwenden, um den Dienst zu injizieren, ich die Attributinstanz nicht abfangen kann. –

+0

Das liegt daran, dass Sie keine Abhängigkeiten in Ihre Attribute einfügen sollten. Bitte lesen Sie die referenzierten Artikel genau. – Steven

+0

Danke. Ich werde es tun! –