使用实体和存储库

时间:2015-04-24 21:13:24

标签: c# .net entity-framework

让我说我有一些IBookRepository。除了ravendb,我想添加名为SQLServerRepository的IBookRepository的SqlServer实现。

创建具有db context的此接口的实现的正确方法是什么。我应该将dbcontext作为参数传递到SQLServerRepository构造函数中,并填充类成员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存储在与存储库,dao层相同的层中,你会怎么做?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

是的,正确的方法是来执行此操作。 “存储库”模式作为已经抽象数据库的库上的附加层是反模式。

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

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

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

实体框架已经为您抽象了数据库。它提供了自己版本的“存储库”作为DbSet和“工作单元”作为DbContext。不要在它上面放置另一个抽象层,它始终是:

  1. 次优,因为现在您无法访问基础完整API和
  2. 泄漏。