1

我正在使用一个已创建基本接口的应用程序,如下所示

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);

}

只是想知道这种方法有什么好处

4

2 回答 2

4

基本存储库允许您指定您希望所有存储库合同具有的行为,而无需在每次IMyEntityRepository创建时重复它。

更有趣的是实现这样的基本存储库并为通用操作指定通用代码:

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();
    }

等等,然后让您的 MyEntityRepository 扩展您的 BaseRepository

于 2013-09-03T22:52:08.397 回答
3

您可以为多个类/接口重用基本接口,而无需实现其他接口——因此您可以IsUnitOfWork在一堆类上使用,而无需GetCourseById在所有这些类上实现。但是,您也可以确保所有 CourseRepositories 都被视为工作单元。

于 2013-09-03T22:41:33.860 回答