0

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

感觉这个应该是内置城堡的支持,但是找不到。

谢谢,

4

0 回答 0