存储库模式似乎缺乏范围。如果我有更多要查询怎么办?
Repository pattern seems lacking in scope. What if I have much more to query?
我应该只使用这5种方法吗?或者我的存储库应该显示我需要的所有 sql 方法。也许我误解了这些例子。我应该 FindByID 和 FindAll 吗?例如,如果我有 5 个下拉菜单。我有 5 个方法,或者我可能有一个方法,5 个查询,和 return 1 table 并绑定到 0-4 tables.
我已经尝试过,网上有几节课和几篇文章,但我仍然觉得示例过于简单。或者,我正在编写太多查询数据库的方法。
顺便说一句,我正在从线性开发转向存储库和工厂。因此,我的过渡基于理解这一点,然后我将转向 EF 和 MVC。
public interface IRepository<T> where T: IEntity
{
void Insert(Student student);
void Delete(Student student);
void Update(Student student);
Student GetById(Student RollNo);
IQueryable<Student> FetchAll();
}
对于简单的实体和聚合,在您的存储库上具有一组标准的 CRUD 操作非常有意义。但是,对于不太标准的聚合和复杂的操作,实现这些通用操作没有意义。
例如:假设在将学生添加到数据库之前,您需要对该学生进行一些复杂的验证并将这些详细信息隐藏在客户端上。
我更喜欢直接使用DBContext。它给了我更多的自由 space 去做我需要做的任何事情,而不用考虑太多将那个方法添加到接口,然后去实现它。
无论如何,如果你想使用存储库模式。我建议使用如下通用的:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class, IEntity
{
private readonly CrudContext _context;
private readonly DbSet<TEntity> _dbSet;
public Repository(CrudContext context)
{
this._context = context;
this._dbSet = context.Set<TEntity>();
}
public IEnumerable<TEntity> List()
{
return _dbSet.ToList();
}
public TEntity GetById(int id)
{
return _dbSet.Find(id);
}
public void Insert(TEntity entity)
{
_dbSet.Add(entity);
_context.SaveChanges();
}
public void Update(TEntity entity)
{
_dbSet.Attach(entity);
_context.Entry(entity).State = EntityState.Modified;
_context.SaveChanges();
}
public void Delete(int id)
{
var entityToDelete = _dbSet.Find(id);
_dbSet.Remove(entityToDelete);
_context.SaveChanges();
}
}
如果是我的偏好,我要么直接在相关 class 中使用 dbcontext,要么创建一个名为 IEntityInserter
的接口,然后对于每个具有太多插入逻辑的记录类型或模型,我将创建一个名为
的实现
StudentBasedEntityInserter : IEntityInserter<Student> {
public void Insert(Student @student){}
}
并将该 IEntityInserter 注入任何依赖 class。
最后,这个热门话题没有正确答案,有些人会同意我的做法,有些人不会。希望它有所帮助。
我应该只使用这5种方法吗?或者我的存储库应该显示我需要的所有 sql 方法。也许我误解了这些例子。我应该 FindByID 和 FindAll 吗?例如,如果我有 5 个下拉菜单。我有 5 个方法,或者我可能有一个方法,5 个查询,和 return 1 table 并绑定到 0-4 tables.
我已经尝试过,网上有几节课和几篇文章,但我仍然觉得示例过于简单。或者,我正在编写太多查询数据库的方法。 顺便说一句,我正在从线性开发转向存储库和工厂。因此,我的过渡基于理解这一点,然后我将转向 EF 和 MVC。
public interface IRepository<T> where T: IEntity
{
void Insert(Student student);
void Delete(Student student);
void Update(Student student);
Student GetById(Student RollNo);
IQueryable<Student> FetchAll();
}
对于简单的实体和聚合,在您的存储库上具有一组标准的 CRUD 操作非常有意义。但是,对于不太标准的聚合和复杂的操作,实现这些通用操作没有意义。
例如:假设在将学生添加到数据库之前,您需要对该学生进行一些复杂的验证并将这些详细信息隐藏在客户端上。
我更喜欢直接使用DBContext。它给了我更多的自由 space 去做我需要做的任何事情,而不用考虑太多将那个方法添加到接口,然后去实现它。 无论如何,如果你想使用存储库模式。我建议使用如下通用的:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class, IEntity
{
private readonly CrudContext _context;
private readonly DbSet<TEntity> _dbSet;
public Repository(CrudContext context)
{
this._context = context;
this._dbSet = context.Set<TEntity>();
}
public IEnumerable<TEntity> List()
{
return _dbSet.ToList();
}
public TEntity GetById(int id)
{
return _dbSet.Find(id);
}
public void Insert(TEntity entity)
{
_dbSet.Add(entity);
_context.SaveChanges();
}
public void Update(TEntity entity)
{
_dbSet.Attach(entity);
_context.Entry(entity).State = EntityState.Modified;
_context.SaveChanges();
}
public void Delete(int id)
{
var entityToDelete = _dbSet.Find(id);
_dbSet.Remove(entityToDelete);
_context.SaveChanges();
}
}
如果是我的偏好,我要么直接在相关 class 中使用 dbcontext,要么创建一个名为 IEntityInserter
的接口,然后对于每个具有太多插入逻辑的记录类型或模型,我将创建一个名为
StudentBasedEntityInserter : IEntityInserter<Student> {
public void Insert(Student @student){}
}
并将该 IEntityInserter 注入任何依赖 class。
最后,这个热门话题没有正确答案,有些人会同意我的做法,有些人不会。希望它有所帮助。