我正在寻找一些关于正确机制的建议,以便在真正的会话pr请求行为中将RavenDB IDocumentSession放入我的存储库。
这是一个绿地MVC3应用程序,我使用NuGet得到了Ninject / Ninject.MVC3。 RavenDB在外部服务器上运行(即非嵌入式)。
我已经设置了Ninject模块来返回正确的存储库,并且还为每个请求设置了一个会话。
然而 - MVC3是否会为每个动作方法实例化控制器?在这种情况下,我可以让MVC3 / Ninject注入我的存储库和他们需要的会话,没问题。
但是,如果在多个请求中重复使用控制器,这可能不起作用,因为前一个请求中的存储库现在可能会使用旧的会话并将其丢弃。
我已经考虑了几种方法 - 上面是基本方法。我还试图做一些像ActionFilterAttribute这样的事情,它在每个请求开始时从IoC容器中获取一个新会话 - 但在这种情况下,我应该把它放在哪里?
我的存储库是否应该使用Session属性,每次实际从容器中获取当前会话?这将在存储库实现和IoC容器之间添加耦合,但我认为应该可以工作。
这样做的正确方法是什么?凉爽的孩子们如何做到这一点?任何帮助将非常感谢!
答案 0 :(得分:12)
除非您正在使用控制器工厂做一些非常有趣的事情,否则每个控制器实例将用于单个请求。 控制器不是线程安全的,并且通常不会超出单个请求。
答案 1 :(得分:3)
我写了一篇关于使用Ninject的InRequestScope
的综合博文,以便每次请求注入IDocumentSession
一次。 Ninject非常擅长为您管理范围。
答案 2 :(得分:-1)
我认为你应该避免使用控制器。
有时可能会有所帮助: 如果会话状态被禁用,我们不应再尝试在Controller上使用Session属性,因为它将为null。关闭会话状态并使用会话属性将为您提供可怕的“对象引用未设置为对象实例”错误。