2016-08-31 34 views
7

tôi sử dụng dependency injection constructor dựa trên khắp mọi nơi trong ứng dụng ASP.NET CORE của tôi và tôi cũng cần phải giải quyết phụ thuộc trong các bộ lọc hành động của tôi:Làm thế nào để sử dụng Bộ lọc hành động với Dependency Injection trong ASP.NET CORE?

public class MyAttribute : ActionFilterAttribute 
{ 
    public int Limit { get; set; } // some custom parameters passed from Action 
    private ICustomService CustomService { get; } // this must be resolved 

    public MyAttribute() 
    { 
    } 

    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) 
    { 
     // my code 
     ... 

     await next(); 
    } 
} 

Sau đó, trong Bộ điều khiển:

[MyAttribute(Limit = 10)] 
public IActionResult() 
{ 
    ... 

Nếu tôi đặt ICustomService đến constructor, sau đó tôi không thể biên dịch dự án của mình. Vì vậy, làm thế nào để tôi supossed để có được trường hợp giao diện trong bộ lọc hành động?

+0

Bạn có thể thêm setter trong thuộc tính CustomService để có thể ghi được không? và thêm ICustomService làm tham số trong hàm tạo? –

+1

Bản sao có thể có của [ASP.Net Core (MVC 6) - Tiêm dịch vụ vào bộ lọc hành động] (http://stackoverflow.com/questions/36109052/asp-net-core-mvc-6-inject-service-into-action -filter) – gilmishal

+0

Bản sao có thể có của [Làm cách nào để thêm thông số vào bộ lọc hành động trong asp.net?](http://stackoverflow.com/questions/39181390/how-do-i-add-a-parameter-to -an-action-filter-in-asp-net) –

Trả lời

8

Nếu bạn muốn tránh mẫu Dịch vụ định vị, bạn có thể sử dụng DI bằng cách xây dựng tiêm với TypeFilter.

Trong việc bạn sử dụng bộ điều khiển

[TypeFilter(typeof(MyActionFilterAttribute), Arguments = new object[] {10})] 
public IActionResult() NiceAction 
{ 
    ... 
} 

ActionFilterAttribute của bạn không cần phải truy cập vào một nhà cung cấp dịch vụ ví dụ nữa.

public class MyActionFilterAttribute : ActionFilterAttribute 
{ 
    public int Limit { get; set; } // some custom parameters passed from Action 
    private ICustomService CustomService { get; } // this must be resolved 

    public MyActionFilterAttribute(ICustomService service, int limit) 
    { 
     CustomService = service; 
     Limit = limit; 
    } 

    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) 
    { 
     await next(); 
    } 
} 

Đối với tôi, chú thích [TypeFilter(typeof(MyActionFilterAttribute), Arguments = new object[] {10})] có vẻ khó xử. Để nhận được chú thích dễ đọc hơn như [MyActionFilter(Limit = 10)], bộ lọc của bạn phải kế thừa từ TypeFilterAttribute. Câu trả lời của tôi về How do I add a parameter to an action filter in asp.net? cho thấy một ví dụ cho phương pháp này.

+0

Bạn cũng có thể sử dụng 'IAsyncActionFilter' thay vì 'IActionFilter' nếu bạn cần không đồng bộ –

1

Bạn có thể sử dụng Service Locator:

public void OnActionExecuting(ActionExecutingContext actionContext) 
{ 
    var service = actionContext.HttpContext.RequestServices.GetService<IService>(); 
} 

Nếu bạn muốn sử dụng constructor tiêm sử dụng TypeFilter. Xem How do I add a parameter to an action filter in asp.net?

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