假设我有一个注入TreeStuffController的ITree接口。构建树是一项昂贵的操作,因此我不希望容器必须为每个webrequest重建一个Tree。
这听起来像是SINGLETON生命周期的情况,但如果每个用户都拥有一棵独特的树呢?是否有SINGLETON PER USER这样的东西?
我基本上希望控制器获取一个Tree对象,该对象是基于用户从持久性中检索的,并且该Tree为每个请求生存,直到用户执行某些操作(比如他们注销)或者对象在x分钟后过期(后续请求将重新启动x分钟计时器。
答案 0 :(得分:4)
你绝对可以在你的应用程序Composition Root中编写一些代码,当你知道用户是谁时,你会查找用户的树。
在my book的第8章中,我将其描述为生命周期样式会话请求上下文,但我也警告它,因为它可能会给您的系统带来容量问题。 Release It!解释了为什么会话状态一般对系统的容量不利。
您可能还遇到会话状态问题,如果您有多台服务器,则需要在所有服务器之间同步会话状态。
但是,当您描述问题时,如果构建树非常昂贵,或者速度比容量更重要,那么会话请求上下文可能值得研究。不过,与性能相关的一切:衡量,不要试图推理它。
也就是说,以下DI容器内置了对会话请求上下文的支持:
除此之外,以下容器使您能够编写自定义生命周期:
答案 1 :(得分:0)
我讨厌回答我自己的问题,但那就是说....
我认为注入树工厂并将新创建的树存储在会话对象中(如果它已经为空)可能会更好。
如果我想为全局共享对象做同样的事情,我可以使用单例或一致性使用Application变量。
如果我能够让构建树操作变得更便宜,那么相应地更新属性将是一件简单的事情。想法?