1

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

MyContext context = new MyContext();

搭建控制器的本质是,对于每个控制器,您通常还会获得相应的存储库。

问题:

1)为您拥有控制器的每个域对象都有一个存储库是否有意义?
与只应公开聚合根的存储库模式相比,这似乎违反直觉。

2) 每次实例化存储库对象时生成 DbContext 派生对象的新实例是否有意义,或者在应用程序启动时向 DI 容器注册 DbContext 派生对象的单例实例并解决它是否有意义像这样的单例存储库:

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


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

在应用程序的生命周期内将 DbContext 派生对象作为单例保留有什么缺点吗?

谢谢。

4

1 回答 1

2
  1. 这取决于您的期望。如果您想使用真正的存储库,您将使用聚合根,并且您将自己编写这些存储库(不自动生成),因为这样的存储库始终是特定的。如果您只想要EF 的通用包装器,您将使用您当前的解决方案。吨
  2. 通常,对于控制器必须使用多个存储库并且必须协调将所有存储库中的数据保存在一起(工作单元模式)的场景,每个 HTTP 请求都会使用新上下文。不要使用单例上下文!
于 2012-04-07T17:02:15.790 回答