【问题标题】:working with entity and repository使用实体和存储库
【发布时间】:2015-04-24 21:13:24
【问题描述】:

假设我有一些 IBookRepository。除了 ravendb,我还想添加 IBookRepository 的 SqlServer 实现,称为 SQLServerRepository。

在考虑数据库上下文的情况下创建此接口的实现的正确方法是什么。我是否应该在 SQLServerRepository 构造函数中将 dbcontext 作为参数传递并填充类成员 dbcontext 以使用 db?

public class SQLServerBookRepository : IBookRepository
{
   private MyDBContext _db;
   public SQLServerRepository(MyDBContext db)
   {
      _db = db;
   }
   public void AddBook(Book b){
      // adding book to context
      _db.SaveChanges();
   }
}

我问这是正确的方法吗?有没有更好的办法? dbcontext和repository、dao层同层应该存放在哪里,你会怎么做呢?

【问题讨论】:

    标签: c# .net entity-framework


    【解决方案1】:

    我通常在我的存储库之外管理 DataContext 生命周期。我使用我的 IoC 工具(通常是结构图)将上下文范围限定为 HttpContext。然后我只需将 DataContext 的一个实例注入到我的存储库中。

    【讨论】:

    • 这是否意味着您通常期望 mvc 控制器内部的存储库接口并从客户端发送该接口的实际表示?
    • 一般来说,我的 MVC 控制器需要一个存储库接口,我让 StructureMap 或 Ninject(任何 IoC 工具)提供一个实例,并且该 IoC 工具还管理数据上下文的生命周期。
    【解决方案2】:

    是的,正确的方法是这样做。作为已经抽象了数据库的库之上的附加层的“存储库”模式是一种反模式。

    此外,像 RavenDB 这样的文档数据库和关系数据库的范例非常不同。您不会以相同的方式解决/建模您的解决方案。

    请参阅这篇博文“RavenDB and the Repository pattern”,该博文由一位与您表达的意图相似的 RavenDB 用户总结了他与 RavenDB 的创建者 Ayende Rahien(又名 Oren Eini)之间的讨论。

    关于您的后续“假设”问题,与为 EF 创建存储库有关。我的建议是一样的:不要

    Entity Framework 已经为您抽象了数据库。它以DbSet 提供自己的“存储库”版本,以DbContext 提供“工作单元”。不要在它上面放置另一个抽象层,它将永远是:

    1. 次优,因为现在您无法访问底层的完整 API 并且
    2. 泄漏。

    【讨论】:

    • 感谢亚历克斯。如果我们暂时忽略 ravendb 实现,您将如何粗略地设置 sqlrepository,如何与 db 上下文通信。
    • 我总体上同意@Alex,但我确实认为在某些特殊情况下,存储库占有一席之地。
    猜你喜欢
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2015-02-21
    • 2013-07-14
    • 2010-12-11
    • 2010-11-24
    相关资源
    最近更新 更多