在c#中使用基接口有什么好处

时间:2013-09-03 22:38:06

标签: c# interface repository-pattern

我使用的应用程序中创建了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);

}

只是想知道这种方法的优势是什么

2 个答案:

答案 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视为工作单元。