每个请求的RavenDB会话使用MVC3和Ninject使用存储库模型

时间:2011-06-19 14:35:53

标签: asp.net-mvc-3 repository-pattern ninject ravendb

我正在寻找一些关于正确机制的建议,以便在真正的会话pr请求行为中将RavenDB IDocumentSession放入我的存储库。

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

我已经设置了Ninject模块来返回正确的存储库,并且还为每个请求设置了一个会话。

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

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

我已经考虑了几种方法 - 上面是基本方法。我还试图做一些像ActionFilterAttribute这样的事情,它在每个请求开始时从IoC容器中获取一个新会话 - 但在这种情况下,我应该把它放在哪里?

我的存储库是否应该使用Session属性,每次实际从容器中获取当前会话?这将在存储库实现和IoC容器之间添加耦合,但我认为应该可以工作。

这样做的正确方法是什么?凉爽的孩子们如何做到这一点?任何帮助将非常感谢!

3 个答案:

答案 0 :(得分:12)

除非您正在使用控制器工厂做一些非常有趣的事情,否则每个控制器实例将用于单个请求。 控制器不是线程安全的,并且通常不会超出单个请求。

答案 1 :(得分:3)

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

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

答案 2 :(得分:-1)

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

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