从容器访问IHttpRequest或IRequestContext

时间:2013-02-14 09:37:51

标签: http-headers servicestack funq

我需要让我的服务依赖的解析基于传入请求中的HTTP标头的值。

我已经尝试过注册这样的工厂方法:

container.Register(c => GetDependencyForRequest(c.Resolve<IHttpRequest>()));

我也尝试过:

container.Register(c => GetDependencyForRequest(c.Resolve<IRequestContext>()));

然而,两者都扔ResolutionException

我宁愿不必在决定使用哪种实现时使用我的服务。我只是希望他们在构造函数中有IDependency并让容器解析它。

有没有办法做到这一点?或者还有另一种方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

我不确定是否有办法通过IoC容器来实现。一种可能的解决方案是创建自己的Service子类,它可以根据Http Header在其构造函数中“新建”您的IDependency。下面是一些psuedocode给你一个想法。希望这可以帮助。

public abstract class MyServiceBase : Service
{
    private Dictionary<string, Func<IDependency>> Dependencies = new Dictionary<string, Func<Dependency>>()
                                                                    {
                                                                        {"header1", () => new Dependency()},
                                                                        {"header2", () => new Dependency()}
                                                                    };

    public IDependency Dependency { get; set; }

    protected MyServiceBase()
    {
        this.Dependency = this.Dependencies[this.RequestContext.GetHeader("headerName")]();
    }
}

答案 1 :(得分:1)

答案比我想象的要简单得多:

container.Register(c => FindDependencyForRequest(HttpContext.Current.ToRequestContext()));