我目前在使用城堡 3.1 的 asp.net MVC Web Api 项目中工作。
我注册了一个生活方式为“PerWebRequest”的组件。
我想手动告诉城堡使用哪个实例,而不是让容器创建实例。在每个 Web 请求上。
这是我实现这一目标的方法:
我通过 DelegatingHandler 将 HttpRequestMessage 实例缓存在 HttpContext 的 Items 集合中(对于那些不知道的人,DelegatingHandler 是 WebApi 框架提供的第一个扩展点)。注册组件时,我使用工厂并从上下文中检索 HttpRequestMessage。
这是代码:
public class InjectingCurrentHttpRequestHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
HttpContext.Current.AddHttpRequest(request);
var output = base.SendAsync(request, cancellationToken);
HttpContext.Current.RemoveHttpRequest();
return output;
}
}
这是我注册组件的方式:
container.Register(Component.For<HttpRequestMessage>()
.LifestylePerWebRequest()
.UsingFactoryMethod(() =>
{
var context = HttpContext.Current;
if (context == null)
throw new Exception("HttpContext is null. Resolving HttpRequestMessage can only be done during an http request. Have you forgot to add the '" + typeof(InjectingCurrentHttpRequestHandler).Name + "' handler in the framework?");
return context.GetHttpRequest();
}));
它确实有效,但我想避免使用 HttpContext.Current 实例。有没有更好的方法来使用城堡实现这一目标?
感觉这个应该是内置城堡的支持,但是找不到。
谢谢,