[英]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.