dependency-injection - DI 容器可以用作 session 状态的替代吗?

标签 dependency-injection

假设我有一个注入(inject)到 TreeStuffController 中的 ITree 接口(interface)。构建树是一项昂贵的操作,因此我不希望容器必须为每个网络请求重建树。

这听起来像是 SINGLETON 生命周期的一个例子,但是如果每个用户都有一个唯一的树怎么办?有没有“每个用户单例”这样的东西?

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

最佳答案

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

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

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

不过,正如您所描述的问题,如果构建树非常昂贵,或者如果速度比容量更重要,那么 session 请求上下文可能值得研究。不过,与与性能相关的所有事情一样:衡量它,不要试图推理它。

也就是说,以下 DI 容器具有对 session 请求上下文的内置支持:

  • 结构图
  • Spring.NET(有限)

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

  • 温莎城堡
  • 团结

关于dependency-injection - DI 容器可以用作 session 状态的替代吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22588095/

相关文章:

design-patterns - 直接在方法代码中调用 DI 容器(MVC Actions)

java - Dagger2 无法在注入(inject)类中注入(inject)字段

c# - Autofac:如何加载引用但未直接使用的程序集

oop - 依赖倒置原理及组成

hibernate - Spring3中如何访问ServletContextListener中的DAO方法

dependency-injection - IServiceCollection 覆盖单个构造函数参数

c# - AWS Lambda 环境变量和依赖注入(inject)

java - Spring Framework 中的@Inject 和@Autowired 有什么区别?在什么条件下使用哪一种?

java - 支持无状态和有状态使用的 JPA 代码

asp.net-mvc - MVC DI/IoC 依赖太多?