6

我正在寻找一些关于正确机制的建议,用于以真正的 session-pr-request 行为将 RavenDB IDocumentSession 放入我的存储库。

这是一个全新的 MVC3 应用程序,我使用 NuGet 获得了 Ninject / Ninject.MVC3。RavenDB 在外部服务器上运行(即非嵌入式)。

我已经设置了 Ninject 模块来返回正确的存储库,以及每个请求的会话。

但是 - MVC3 是否会为每个操作方法实例化控制器?在这种情况下,我可以只允许 MVC3/Ninject 注入我的存储库和他们需要的会话,没问题。

但是,如果一个控制器在多个请求中重复使用,这可能不起作用,因为之前请求的存储库现在可能会使用一个旧的并被丢弃的会话。

我已经研究了几种方法来做到这一点 - 以上是基本的方法。我也尝试过在每个请求开始时从 IoC 容器获取新会话的 ActionFilterAttribute 之类的操作 - 但在这种情况下,我应该把它放在哪里?

我的存储库是否应该有一个它使用的 Session 属性,它每次实际上都从容器中获取当前会话?这会增加存储库实现和 IoC 容器之间的耦合,但我猜应该可以。

这样做的正确方法是什么?酷孩子们是怎么做到的?任何帮助将不胜感激!

4

3 回答 3

12

Unless you are doing something really funny with your controller factory, each controller instance will be used for a single requests. Controllers are not thread safe and will not usually survive beyond a single request.

于 2011-06-19T15:28:52.160 回答
3

我写了一篇关于使用 Ninject 的综合博客文章,InRequestScope以便IDocumentSession每个请求注入一次。Ninject 非常擅长为您管理范围。

http://www.dalsoft.co.uk/blog/index.php/2012/04/12/mvc-get-ravenb-up-and-running-in-5-minutes-using-ninject/

于 2012-04-16T08:21:49.663 回答
-1

我认为你应该避免继续使用控制器。

有时它可能会有所帮助:如果会话状态被禁用,我们不应再尝试在控制器上使用会话属性,因为它将为空。关闭会话状态并使用会话属性会给您带来可怕的“对象引用未设置为对象实例”错误。

于 2011-06-19T15:33:03.260 回答