C# 使用实体和存储库

C# 使用实体和存储库,c#,.net,entity-framework,C#,.net,Entity Framework,让我们假设我有一些IBookRepository。除了ravendb之外,我还想添加名为SQLServerRepository的IBMookRepository的SqlServer实现 在考虑db上下文的情况下,创建此接口实现的正确方法是什么。我是否应该在SQLServerRepository构造函数中传递dbcontext作为参数,并填充类成员dbcontext以使用db public class SQLServerBookRepository : IBookRepository { p

让我们假设我有一些IBookRepository。除了ravendb之外,我还想添加名为SQLServerRepository的IBMookRepository的SqlServer实现

在考虑db上下文的情况下,创建此接口实现的正确方法是什么。我是否应该在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存储在与存储库dao层相同的层中的何处,您将如何执行此操作?

我通常在存储库之外管理DataContext生存期。我使用IoC工具(通常是structuremap)将上下文范围扩展到HttpContext。然后,我只需将DataContext的一个实例注入到我的存储库中。

是的,正确的方法是而不是。“Repository”模式作为已经抽象数据库的库上的附加层是一种反模式

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

请参阅这篇博客文章“”,作者是RavenDB的一位用户,他与您表达了类似的意图,总结了他与RavenDB的创建者Ayende Rahien(又名Oren Eini)之间的讨论

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

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

  • 次优,因为现在您无法访问底层完整API和
  • 漏水的

  • 这是否意味着通常情况下,您希望在mvc控制器内有该存储库的接口,并从客户端发送该接口的实际表示形式?通常情况下,我的mvc控制器需要存储库的接口,我让StructureMap或Ninject(任何IoC工具)提供一个实例,IoC工具还管理datacontext生命周期。谢谢alex。如果我们现在忽略ravendb实现,您将如何粗略地设置sqlrepository,如何与db上下文通信。我大体上同意@Alex,但我确实认为在某些特殊情况下,存储库有自己的位置。