我正在使用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实体的会话范围的建议和反馈。
答案 0 :(得分:5)
Ninject本身没有这样的范围有几个原因:
您的实施Ninject-wise没有问题。但正如我之前所说,你必须非常谨慎地将数据放入会话范围。我认为您还应该考虑其他方法来缓存允许在使用此方法之前驱逐数据的数据,例如,使用NHibernate我会建议调查2级缓存。如果您仍然决定使用会话数据,更好的方法是将其放入会话而不是具有Ninject会话范围,因为它允许扩展应用程序。