让我说我有一些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层相同的层中,你会怎么做?
答案 0 :(得分:1)
我通常在我的存储库之外管理DataContext生命周期。我使用我的IoC工具(通常是结构图)将上下文范围扩展到HttpContext。然后我只是将我的DataContext实例注入我的存储库。
答案 1 :(得分:1)
是的,正确的方法是不来执行此操作。 “存储库”模式作为已经抽象数据库的库上的附加层是反模式。
此外,RavenDB和关系数据库等文档数据库的范例也大不相同。您不会以同样的方式解决/建模您的解决方案。
请参阅此博客文章“RavenDB and the Repository pattern”,RavenDB的用户与您表达的意图相似,总结了他与RavenDB的创建者Ayende Rahien(又名Oren Eini)之间的讨论。
关于您的后续“假设”问题,与创建EF的存储库有关。我的建议是一样的:不要。
实体框架已经为您抽象了数据库。它提供了自己版本的“存储库”作为DbSet
和“工作单元”作为DbContext
。不要在它上面放置另一个抽象层,它始终是: