3

我需要根据传入请求中 HTTP 标头的值来解决我的服务的依赖关系。

我试过像这样注册一个工厂方法:

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

我也试过:

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

但是,两者都抛出ResolutionExceptions。

我不想让我的服务负担决定使用哪种实现。我只是希望他们IDependency在他们的构造函数中有一个并让容器解决它。

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

4

2 回答 2

2

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

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")]();
    }
}
于 2013-02-14T16:18:08.983 回答
1

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

container.Register(c => FindDependencyForRequest(HttpContext.Current.ToRequestContext()));
于 2013-02-14T17:54:03.417 回答