我目前在使用城堡3.1的asp.net MVC Web Api项目中工作。
我注册了一个带有'PerWebRequest'生活方式的组件。
我想手动告诉castle要使用哪个实例,而不是让容器创建实例。在每个网络请求上。
以下是我如何做到这一点:
我通过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实例。有没有更好的方法来实现这个使用城堡?
我觉得对此的支持应该是内置城堡,但找不到它。
谢谢,