假设我有一个注入(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/