У меня есть класс, который требует доступа к HttpRequestMessage в моей службе веб-API. На данный момент у меня есть следующий код, чтобы захватить сообщение в трубопроводе и сохранить его для последующего использования (на основе this и this):Захват и инъекция HttpRequestMessage в веб-API с помощью Ninject
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, так как он там, чтобы не добавлять новое связывание при каждом вызове службы. Я подозреваю, что это связано с одноэлементным характером стека веб-API, но не смогло разобраться, как правильно справиться с этим.
В общем, я не могу использовать последний неустойчивый пакет Nuget из Ninject web api из-за сообщенной ошибки (и игнорируется) here.
Может кто-нибудь предложить правильный способ улучшить мой код, чтобы сделать его более понятным и облегчить жизнь будущим сопровождающим (и давайте посмотрим правде в глаза - это, вероятно, будет мне).
Спасибо.
Я должен был сделать то же самое в последнее время с Ninject (и ранее с StructureMap) и до сих пор найти лучшее решение. –
@BenFoster С тех пор я перешел на Autofac (по многим причинам, а не только по этой проблеме), и хотя он обеспечивает более чистый способ ввода HttpRequestMessage в запущенный код, я не смог получить доступ к нему в моей памяти интеграционные тесты. Таким образом, каждая инфраструктура DI, похоже, имеет свои собственные уникальные компромиссы. –
Любой прорыв? У меня такая же проблема ... – Hudvoy