我有一個需要訪問Web API服務中的HttpRequestMessage的類。 (基於this和this)的那一刻,我有下面的代碼在管道中捕捉信息,並保存起來以備以後:使用Ninject在Web API中捕獲和注入HttpRequestMessage
public class ContextCapturingControllerActivator : IHttpControllerActivator
{
private readonly IKernel kernel;
private HttpRequestMessage requestMessage;
public ContextCapturingControllerActivator(IKernel kernel)
{
this.kernel = kernel;
}
public IHttpController Create(HttpRequestMessage requestMessage,
HttpControllerDescriptor controllerDescriptor,
Type controllerType)
{
this.kernel.Rebind<HttpRequestMessage>()
.ToConstant<HttpRequestMessage>(requestMessage);
var controller = (IHttpController)this.kernel.GetService(controllerType);
this.requestMessage = requestMessage;
requestMessage.RegisterForDispose(
new Release(() => this.kernel.Release(controller)));
return controller;
}
private class Release : IDisposable
{
private readonly Action release;
public Release(Action release)
{
this.release = release;
}
public void Dispose()
{
this.release();
}
}
}
在我的作文根,我配置ControllerActivator
:
kernel.Bind<IHttpControllerActivator>()
.To<ContextCapturingControllerActivator>();
最終的結果是,從配置的角度來看,HttpRequestMessage
「神奇」地注入了所需的任何地方,因爲它是在ControllerActivator
之內爲我們完成的。我無法從我的作文根部注入信息。我對於Rebind也沒什麼興趣,因爲它在那裏避免每次調用服務時都添加新的綁定。我懷疑這是由於Web API堆棧的單例性質,但無法解決如何正確處理這些問題。
一般來說,我不能使用Ninject web api的最新不穩定的Nuget包,因爲報告(並且被忽略)的錯誤here。
任何人都可以提出改進我的代碼的正確方法,使其更清晰一點,並使未來維護者的生活更輕鬆(讓我們面對它 - 這可能是我)。
謝謝。
我不得不與Ninject最近做同樣的(以前用StructureMap)和還沒有找到更好的解決方案。 –
@BenFoster我自從轉換到Autofac(出於許多原因,不僅僅是這個問題),並且雖然它提供了一種更乾淨的方式來將HttpRequestMessage注入到正在運行的代碼中,但我還是無法在我的內存中訪問它集成測試。所以,每個DI框架似乎都有其獨特的權衡。 –
任何突破?我有同樣的問題... – Hudvoy