18

Tôi thực sự gặp khó khăn về cách tiếp cận để làm phụ thuộc tiêm vào bộ lọc hành động của api web. Tôi có một bộ lọc hành động như thế này:Làm thế nào để thực hiện tiêm phụ thuộc vào Bộ lọc hành động trên ASP.NET Web API

public class AuthorizationAttribute : ActionFilterAttribute 
{ 
    public IApiKeyRepository Repository { get; set; } 

    private Guid GetApiKey(string customerKey) 
    { 
     return Repository.GetApiKey(customerKey); 
    } 

    public override void OnActionExecuting(HttpActionContext actionContext) 
    {   
    } 
} 

Tôi muốn làm tiêm tài sản trên Repository tài sản bằng cách sử dụng Windsor (nhưng nó không quan trọng mà IoC container được sử dụng)

tôi đã đi đến tùy chỉnh FilterProvider nhưng nó đã không làm việc cho tôi, không ai có giải pháp hoặc chạy mã về điều này? nó sẽ được nhiều đánh giá cao

Trả lời

1

Bạn có thể sử dụng hội đồng Ninject.Web.WebApi (rõ ràng là sử dụng Ninject là IoC) để thực hiện công việc này. Tôi sẽ đề nghị xem xét nguồn và SampleApplication thông qua https://github.com/ninject/Ninject.Web.WebApi để xem cách chúng đang hoàn thành việc lọc Bộ lọc.

+0

Bạn có thể phác thảo các bước để sử dụng 'Ninject.Web.WebApi' để thực hiện việc lọc bộ lọc không? SampleApplication không phải là rất hữu ích. –

+0

Đây là một phác thảo tốt về cách LogFilter trong SampleApplication đang hoạt động - https://github.com/ninject/Ninject.Web.WebApi/wiki/Dependency-injection-for-filters –

4

Bạn cần kiểm tra triển khai IOC cụ thể của mình. Các thùng chứa IOC như NInject và Autofac có một số loại bộ lọc tiêm bằng cách tiêm các thuộc tính công cộng. Windsor Tôi không chắc chắn về, nhưng đây là một liên kết tạo ra một wrapper có thể giúp với Windsor: http://eagle081183.wordpress.com/2010/09/21/dependency-injection-with-asp-net-mvc-action-filters/ và một bài báo trực tiếp giải quyết vấn đề với Windsor: http://weblogs.asp.net/psteele/archive/2009/11/04/using-windsor-to-inject-dependencies-into-asp-net-mvc-actionfilters.aspx.

Đối với đầy đủ với Ninject và Autofac:

Ninject:

Autofac:

** EDIT - tùy chọn bổ sung **

Bạn sẽ có thể làm GlobalConfiguration.Configuration.DependencyResolver.GetService(...) từ bất kỳ bộ lọc không phụ thuộc vào thùng chứa IOC bạn đang sử dụng.

+0

+1 cho AutoFac, nó khớp với độc đáo với WebAPI – leon

+2

Cảm ơn bạn đã trả lời Alex, nhưng hầu hết liên kết mà bạn đã giới thiệu là dành cho MVC, không phải cho Web API, đó là loại tiêm khác nhau giữa API Web và MVC, tôi nghĩ vậy. –

+0

Tôi đã thực hiện thành công với Autofac nhưng không thể nói chuyện với những người khác. Bạn cũng có thể truy cập dịch vụ mà bạn muốn trực tiếp từ Bộ lọc thông qua GlobalConfiguration.Configuration.DependencyResolver.GetService (...). Không lý tưởng, nhưng nó sẽ hoạt động. – AlexGad

4

Đối WebAPI và AutoFac bạn có thể sử dụng:

builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration); 

Các tài liệu là here.

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