我使用的应用程序中创建了Base inteface,如下所示
public interface IBaseRepository : IDisposable
{
bool IsUnitOfWork { get; set; }
void SaveChanges();
}
然后其他接口将此接口扩展为
public interface ICourseRepository : IBaseRepository
{
Course GetCourseById(int id);
List<Course> GetCourses();
CourseModule GetCourseModuleById(int id);
}
只是想知道这种方法的优势是什么
答案 0 :(得分:4)
基本存储库允许您指定希望所有存储库合同具有的行为,而无需在您创建的每个IMyEntityRepository
中重复该行为。
然后更有趣的是,然后像这样实现Base Repository并指定通用操作的通用代码:
public abstract class BaseRepository<TEntity> : IRepository<TEntity> where TEntity : class {
private DbContext _context;
public Repository(DbContext context) {
if (context == null) {
throw new ArgumentNullException("context");
}
_context = context;
}
protected DbContext DbContext { get { return _context; } }
public void Create(TEntity entity) {
if (entity == null) {
throw new ArgumentNullException("entity");
}
DbContext.Set<TEntity>().Add(entity);
DbContext.SaveChanges();
}
public TEntity GetById(int id) {
return DbContext.Set<TEntity>().Find(id);
}
public void Delete(TEntity entity) {
if (entity == null) {
throw new ArgumentNullException("entity");
}
DbContext.Set<TEntity>().Attach(entity);
DbContext.Set<TEntity>().Remove(entity);
DbContext.SaveChanges();
}
public void Update(TEntity entity) {
if (entity == null) {
throw new ArgumentNullException("entity");
}
DbContext.Set<TEntity>().Attach(entity);
DbContext.Entry(entity).State = EntityState.Modified;
DbContext.SaveChanges();
}
等,然后让你的MyEntityReporitory扩展你的BaseRepository
答案 1 :(得分:3)
您可以为多个类/接口重用基本接口,而无需实现其他接口 - 因此您可以在一堆类上使用IsUnitOfWork
,而无需在所有类上实现GetCourseById
那些课程。但是,您还可以确保将所有CourseRepositories视为工作单元。