在具有作用域生活方式的组件中,使用单例生活方式的依赖的作用域是什么?
本文关键字:作用域 生活方式 单例 依赖 是什么 组件 | 更新日期: 2023-09-27 18:06:34
在同一个容器上,每个web请求。
它们在这个上下文中相等吗?也就是说,单例是否有效地限定了作用域组件的生命周期?或者它真的是一个单例(跨越多个web请求)。
在庞大的温莎城堡文档中没有任何帮助,
编辑:Composition of Container控制器<-服务A (<-表示依赖于)
服务A <-会话A
命令<-会话A
BeginScope()在每次请求控制器
时被调用控制器的作用域
服务A是单例的
会话A的作用域
命令的作用域
在此场景中,服务A和会话A的作用域是否相同?
组件注册决定生活方式。使用单例方式注册的组件将被重用,直到它所注册的容器被处置为止,无论它被注入到其他哪些组件中。
如果每个web请求生命周期的另一个组件需要它,那么每个web请求都将注入相同的单例实例。
对编辑的回应:
服务A实例化一次。会话A每次都获得服务A的相同实例。
这里有一个错误,一些组件注册的生命周期比依赖它们的其他组件短。这是Mark Seemann最近在这里写的"俘虏依赖问题"的一个例子:http://blog.ploeh.dk/2014/06/02/captive-dependency/.
例如:
服务A <-会话A
时Service A是单例的,Session A是作用域的。
这意味着第一次请求服务A时,它将被创建,它的依赖会话A将被创建。服务A现在存储对会话A的引用。
但是,由于服务A被注册为Singleton,每次请求它时,您都会返回实际相同的对象,并且它将具有与第一次会话A相同的实际引用。
从长远来看,这会给你带来潜在的严重和微妙的错误,这意味着你必须非常小心你的注册和生活方式。我认为,温莎城堡现在有了一些检测这些生活方式错误配置的手段。