DI容器可以用作会话状态的替代方案吗?

时间:2014-03-23 07:14:44

标签: dependency-injection

假设我有一个注入TreeStuffController的ITree接口。构建树是一项昂贵的操作,因此我不希望容器必须为每个webrequest重建一个Tree。

这听起来像是SINGLETON生命周期的情况,但如果每个用户都拥有一棵独特的树呢?是否有SINGLETON PER USER这样的东西?

我基本上希望控制器获取一个Tree对象,该对象是基于用户从持久性中检索的,并且该Tree为每个请求生存,直到用户执行某些操作(比如他们注销)或者对象在x分钟后过期(后续请求将重新启动x分钟计时器。

2 个答案:

答案 0 :(得分:4)

你绝对可以在你的应用程序Composition Root中编写一些代码,当你知道用户是谁时,你会查找用户的树。

my book的第8章中,我将其描述为生命周期样式会话请求上下文,但我也警告它,因为它可能会给您的系统带来容量问题。 Release It!解释了为什么会话状态一般对系统的容量不利。

您可能还遇到会话状态问题,如果您有多台服务器,则需要在所有服务器之间同步会话状态。

但是,当您描述问题时,如果构建树非常昂贵,或者速度比容量更重要,那么会话请求上下文可能值得研究。不过,与性能相关的一切:衡量,不要试图推理它。

也就是说,以下DI容器内置了对会话请求上下文的支持:

  • StructureMap
  • Spring.NET(限定版)

除此之外,以下容器使您能够编写自定义生命周期:

  • Castle Windsor
  • 统一

答案 1 :(得分:0)

我讨厌回答我自己的问题,但那就是说....

我认为注入树工厂并将新创建的树存储在会话对象中(如果它已经为空)可能会更好。

如果我想为全局共享对象做同样的事情,我可以使用单例或一致性使用Application变量。

如果我能够让构建树操作变得更便宜,那么相应地更新属性将是一件简单的事情。想法?