在castle windsor中指定运行时PerWebRequest组件的实例

时间:2013-09-16 17:26:57

标签: asp.net-mvc asp.net-web-api castle-windsor castle windsor-3.0

我目前在使用城堡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实例。有没有更好的方法来实现这个使用城堡?

我觉得对此的支持应该是内置城堡,但找不到它。

谢谢,

0 个答案:

没有答案