如何实现“GenericRepository”实现对象到Linq层?我正在研究MVC

时间:2012-01-08 18:28:49

标签: asp.net-mvc linq entity-framework-4.1 repository-pattern asp.net-4.0

我需要实现一个通用存储库(可重用的.dll)来应用操作(例如更新,插入,删除,搜索),这样我们就可以从包含多个连接和复杂性的数据库中进行复杂的查询。

我这样做

public class GenericRepository<TEntity> where TEntity : class
{
//internal SchoolContext context; which context I need to use to behav as generic(.dll)
internal DbSet<TEntity> dbSet;

   public GenericRepository(SchoolContext context) //that won't be this context
   {
        this.context = context;
        this.dbSet = context.Set<TEntity>();
   }
   .... public virtual void Insert(TEntity entity){..}
   .... public virtual void Delete(TEntity entityToDelete){..}
   .... public virtual void Update(TEntity entityToUpdate){..}
 }

那么,哪个上下文,以某种方式实现DBContexts的相同工作(即使用LINQ从对象与DB交互)?

其次, 我正在使用一些特定的类(如果这个通用存储库不能满足我的操作要求),就像一些巨大的复杂查询。 喜欢

  class StudentRepository : GenericRepository
  {

  }
  class PersonRepository : GenericRepository
  {

  }

... 这种方式是对的还是其他一些好的实现方式?

此致 乌斯曼

1 个答案:

答案 0 :(得分:2)

使用特定存储库是正确的方法,因为它封装了给定实体类型/聚合根的特定数据访问逻辑。使用通用存储库本身并不正确,因为它doesn't bring any additional value。它只是已经is "generic repository"的EF DbSet的包装器,它仍然存在与IDbSet / DbSet相关的所有问题。如果您的主要目标是使代码可测试you will not achieve that with generic repository公开IQueryable(以允许未被存储库隐藏的复杂查询和连接)。