2015-05-07 16 views
6

Tôi đang đấu tranh với ASP.NET MVC 6 (bản beta 4 phát hành) cố gắng tiêm một dịch vụ trong một thuộc tính bộ lọc điều khiển loại AuthorizationFilterAttribute.Tiêm phụ thuộc bên trong một FilterAttribute trong ASP.NET MVC 6

Đây là dịch vụ (nó đã một dịch vụ khác tiêm)

public class UsersTableRepository 
{ 
    private readonly NeurosgarContext _dbContext; 

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

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

    //other stuff... 
} 

Đây là phương pháp ConfigureServices trong Startup lớp cho các dịch vụ cho phép

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

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

Một đơn giản "giả" điều khiển với hai bộ lọc được xác định trên đó. Bạn có thể nhận thấy rằng tôi đã thực hiện DI bên trong bộ điều khiển này bằng cách trang trí thuộc tính với [FromServices] và nó hoạt động.

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

Làm DI cùng trong BasicAuthenticationFilter không làm việc và trong thời gian chạy UserRepository tài sản là một tham chiếu null.

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

Bất kỳ ý tưởng nào về cách giải quyết vấn đề này?

Trả lời

7

Không được tiêm phụ thuộc vào các thuộc tính của bạn như được giải thích here. Tạo số attributes passive hoặc đặt thuộc tính của bạn là humble object như được mô tả here.

+0

Vấn đề là nếu tôi sử dụng một hàm tạo trong bộ lọc để tiêm dịch vụ tôi không thể đánh chặn cá thể thuộc tính. –

+0

Đó là vì bạn không nên tiêm phụ thuộc vào các thuộc tính của bạn. Vui lòng đọc kỹ các bài viết được tham chiếu. – Steven

+0

Cảm ơn bạn. Tôi sẽ làm nó! –

Các vấn đề liên quan