簡體   English   中英

ASP.NET Web API中處理程序和篩選器的依賴注入

[英]Dependency Injection for Handlers and Filters in ASP.NET Web API

我正在嘗試連接我的Web Api項目,以便將Castle Windsor用於IoC

我按照這篇優秀的文章為我的控制器做了這個

我現在正試圖將依賴注入到DelegatingHandler和ActionFilterAttribute中

我試圖在常規ASP.Net MVC中復制用於過濾器的技術,但它們似乎不適用於Web Api

誰有人設法讓這個工作?

我不確定Web Api中的相關擴展點是什么

我已經看到了這個建議

config.MessageHandlers.Add(_myContainer.Resolve<IApiUsageLogger>());

但不確定是否有更好的方法。 我更願意利用創建這些處理程序/過濾器的機制

因為這有很多處理程序的服務位置的味道。 是否有一個點可以創建所有處理程序?

有任何想法嗎?

由於MessageHandlers集合是全局的,因此它實際上是單例列表。 當處理程序本身沒有狀態且沒有依賴關系時,這很好,但在基於SOLID設計原則的系統中,這些處理程序很可能具有自己的依賴關系,並且很可能這些依賴關系需要一個壽命短於單身人士。

如果是這種情況,則不應將此類消息處理程序創建為單例,因為通常,組件的生命周期永遠不會超過其依賴項的生存期。

但是,Web API缺少允許在每個請求上解析此類處理程序的任何鈎子,但是通過使用代理類可以輕松創建此類機制:

public class DelegatingHandlerProxy<TDelegatingHandler> : DelegatingHandler
    where TDelegatingHandler : DelegatingHandler
{
    private readonly WindsorContainer container;

    public DelegatingHandlerProxy(WindsorContainer container)
    {
        this.container = container;
    }

    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // trigger the creation of the scope.
        request.GetDependencyScope();

        var handler = this.container.Resolve<TDelegatingHandler>();

        handler.InnerHandler = this.InnerHandler;

        var invoker = new HttpMessageInvoker(handler);

        var response = await invoker.SendAsync(request, cancellationToken);

        container.Release(handler);

        return response;
    }
}

此代理可以使用如下:

GlobalConfiguration.Configuration.MessageHandlers.Add(
    new DelegatingHandlerProxy<MyCustomHandler>(myContainer));

代理是一個單例,但它會在每個請求上解析指定的MyCustomHandler

到目前為止似乎沒有延伸點。 但是有一個請求,請訪問http://aspnetwebstack.codeplex.com/workitem/62

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM