【问题标题】:Accessing IHttpRequest or IRequestContext from container从容器访问 IHttpRequest 或 IRequestContext
【发布时间】:2013-02-14 09:37:51
【问题描述】:

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

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

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

我也试过了:

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

但是,两者都抛出ResolutionExceptions。

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

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

【问题讨论】:

    标签: http-headers servicestack funq


    【解决方案1】:

    我不确定是否有办法通过 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")]();
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 如果您使用的是ServiceStack's built-in Funq IOC,您不希望通过指定 ReuseScope.None 使其成为单例,即container.Register(c =&gt; new FindDependencyForRequest(HttpContext.Current.ToRequestContext())).ReusedWithin(ReuseScope.None);
      • 我的印象是使用Container.RegisterFunc&lt;T&gt; 重载会导致提供的工厂被调用每个分辨率,有效地使重用范围瞬态。 ReusedWithin(ReuseScope.None) 真的有必要吗?
      • 不知道为什么你会假设,所有的文档都说它默认是单例的,你可以使用.ReusedWithin() 来改变生命周期。 Here are some tests that shows Funq's default behavior.
      • 那是我的错。我一定错过了。我假设大多数其他 IoC 容器的行为使用瞬态生命周期作为默认行为。
      猜你喜欢
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2017-07-12
      • 2021-02-18
      • 2019-06-13
      • 2015-09-15
      • 1970-01-01
      相关资源
      最近更新 更多