在同一个容器上,每个Web请求。
在这种背景下,它们是否相同?也就是说,单例是否有效地限定了范围组件的生命周期,因为它是?或者它是真正的单身人士(跨越多个网络请求)。
广州Castle Windsor文档中没有任何内容可以帮到这里,
编辑:容器的组成
Controller< - Service A(< - means依赖于)
服务A< - 会话A
命令< - 会话A
每次请求控制器时都会调用BeginScope()
控制器的范围是
服务A是单身人士
会话A的范围是
命令的范围是
在这种情况下服务A和会话A是否等效作用域?
答案 0 :(得分:1)
组件注册决定了生活方式。注册单身生活方式的组件将被重复使用,直到注册它的容器被放置,无论注入的其他组件是什么。
如果每个Web请求生命周期的另一个组件需要它,则会在每个Web请求上注入相同的单例实例。
对编辑的回应:
服务A实例化一次。会话A每次都获得相同的服务A实例。 Command为每个Web请求获取一个新的Session A实例。
答案 1 :(得分:1)
这里有一个错误,其中一些组件注册时的生活方式较短,而其他组件依赖于它们。这是"圈养依赖问题的一个例子" Mark Seemann最近在这里写到:http://blog.ploeh.dk/2014/06/02/captive-dependency/。
例如:
服务A< - 会话A
当
服务A是单例,会话A是作用域。
这意味着第一次请求服务A时,将创建服务A并创建其依赖关系会话A.服务A现在存储对其会话A的引用。
但是,由于服务A注册为Singleton,因此每次请求它时,您将获得实际相同的对象,并且第一次对Session A具有相同的引用。
从长远来看,这将导致您潜在的严重和微妙的错误,这意味着您必须非常小心您的注册和生活方式。我认为Castle Windsor现在有一些方法可以检测这些生活方式的错误配置。有关详细信息,请参阅Mark Seemann的文章。