Ninject,MVC和会议范围:合理的实践?

时间:2011-05-13 06:10:33

标签: asp.net-mvc session ninject

我正在使用Entity Framework构建MVC3应用程序,其中几乎所有操作都只允许授权用户使用。因此,我经常需要引用成员实体。我已经尝试了不同的缓存方式的方法,并提出了一种非常快的方法。但我想对我正在做的事情的风险/缺点提出一些建议/看法。

我已经定义了一个工厂类来检索使用Ninject“注册”的Member实例,这样我就可以在任何需要它的地方使用它。 Ninject绑定是“会话范围”(我将在稍后解释)。工厂方法首先检查Session以查看它是否包含先前创建的Member实例。如果Session没有,则例程通过EF从底层数据库创建一个实例,将值存储在Session中并返回它。

因为针对Member实例的一些访问是EF调用,我必须确保EF对象上下文也在会话范围内(我学习了针对最初在不同上下文中创建的Member实例调用EF例程的困难方法不太好用)。由于工厂和对象上下文是通过Ninject创建的,因此我必须为Ninject定义一个Session范围。

我找到了一个代码片段here,我可以修改它以满足我的需求。但是这是一个如此简单的片段,我想知道Ninject(或Ninject MVC)是否有“本机”提供这种能力的原因。这让我想知道我是否正在通过我正在做的事情来解决问题。

我确实认识到在Session中存储东西有很多方面你需要编程,其中主要是存储对象可以随时“消失”的事实(即,你总是必须有一个当你得到它时重新创建它的方法)。但是虽然这增加了足够的复杂性,我不想为很多对象做这件事,但为单个Member对象做这件事并不是那么困难。

无论如何,我们将非常感谢有关Ninject绑定和在EFC应用的会话中存储EF实体的会话范围的建议和反馈。

1 个答案:

答案 0 :(得分:5)

Ninject本身没有这样的范围有几个原因:

  • 实施使得无法扩展应用程序。虽然可以在多个IIS实例之间共享会话,但会话范围中的数据却不能,因为每个IIS实例都有自己的Ninject内核。
  • 它会鼓励用户大规模使用它。但通常将数据放入会话是不是一个好主意,除非绝对必要,因为它被缓存了很长时间,并且没有机制在会话超时之前将其从内存中取出。这可能很快导致内存不足问题。出于这个原因,应该非常仔细地使用会话数据。
  • 会话范围数据的首选方式是将其添加到会话中,并将瞬态绑定添加到返回此数据的方法,或者如果新实例尚不可用则创建新实例。这样,数据就会与会话一起被删除,而不是将其保留在内存中一段时间​​,直到Ninject发布它为止。此外,通过这种方式支持应用程序的扩展。

您的实施Ninject-wise没有问题。但正如我之前所说,你必须非常谨慎地将数据放入会话范围。我认为您还应该考虑其他方法来缓存允许在使用此方法之前驱逐数据的数据,例如,使用NHibernate我会建议调查2级缓存。如果您仍然决定使用会话数据,更好的方法是将其放入会话而不是具有Ninject会话范围,因为它允许扩展应用程序。