在MVC3脚手架存储库中的Singleton DbContext派生对象

时间:2012-04-06 19:36:59

标签: asp.net-mvc-3 ninject entity-framework-4.3

我在MVC4应用程序和Ninject.MVC3中使用EF 4.3。 控制器是使用-Repository开关的MVCcaffolded。 MVCScaffolder使用EF创建存储库类(以及相应的IRepository接口),用于数据访问,其中DbContext派生对象始终作为每个脚手架存储库中的数据成员“新建”。

MyContext context = new MyContext();

脚手架控制器的本质是,对于每个控制器,您通常也会获得相应的存储库。

问题:

1)为每个拥有控制器的域对象建立一个存储库是否有意义?    与仅存在聚合根的存储库模式相比,这似乎违反直觉    暴露。

2)每次生成一个DbContext派生对象的新实例是否有意义    存储库对象是实例化的,或者有一个单例实例是否有意义    在app启动时向DI容器注册的DbContext派生对象并在其中解析它    单身存储库如此:

Bind<MyContext>().To<MyContext>().InSingletonScope();  //ninject code on app startup


 //resolve context in repositories: 
 MyContext context = ServiceLocator.Current.GetInstance<MyContext>();

持有DbContext派生对象是否有任何缺点    申请生命周期内的单身人士?

感谢。

1 个答案:

答案 0 :(得分:2)

  1. 这取决于你的期望。如果你想使用真正的存储库,你将使用聚合根,你将自己编写这些存储库(不自动生成),因为这样的存储库总是特定的。如果您只想generic wrapper around EF,您将使用当前的解决方案。 Ť
  2. 通常,对于您的控制器必须使用多个存储库并且必须协调将所有存储库中的数据保存在一起(工作单元格模式)的情况,每个HTTP请求都使用新的上下文。 Don't use singleton context!