在具有范围生活方式的组件中使用单身生活方式的依赖关系的范围是什么?

时间:2014-06-04 13:37:49

标签: c# .net castle-windsor

在同一个容器上,每个Web请求。

在这种背景下,它们是否相同?也就是说,单例是否有效地限定了范围组件的生命周期,因为它是?或者它是真正的单身人士(跨越多个网络请求)。

广州Castle Windsor文档中没有任何内容可以帮到这里,

编辑:容器的组成

Controller< - Service A(< - means依赖于)

服务A< - 会话A

命令< - 会话A

每次请求控制器时都会调用BeginScope()

控制器的范围是

服务A是单身人士

会话A的范围是

命令的范围是

在这种情况下服务A和会话A是否等效作用域?

2 个答案:

答案 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的文章。