C# 如何处理两个几乎相同的接口?

C# 如何处理两个几乎相同的接口?,c#,interface,C#,Interface,我有两个接口,有许多相同的方法,它似乎打破了干燥的原则。如果我的接口中没有这些重复的方法,我如何获得它?或者这对接口来说无关紧要 接口1: public interface IRepositoryBase<TEntity> where TEntity : class { void Commit(); void Delete(object id); void Delete(TEntity entity); void Dispose(); IQue

我有两个接口,有许多相同的方法,它似乎打破了干燥的原则。如果我的接口中没有这些重复的方法,我如何获得它?或者这对接口来说无关紧要

接口1:

public interface IRepositoryBase<TEntity> where TEntity : class
{
    void Commit();
    void Delete(object id);
    void Delete(TEntity entity);
    void Dispose();
    IQueryable<TEntity> GetAll();
    IQueryable<TEntity> GetAll(object filter);
    TEntity GetById(object id);
    TEntity GetFullObject(object id);
    IQueryable<TEntity> GetPaged(int top = 20, int skip = 0, object orderBy = null, object filter = null);
    void Insert(TEntity entity);
    void Update(TEntity entity);
}
公共接口IRepositoryBase,其中tenty:class
{
无效提交();
作废删除(对象id);
无效删除(潜在实体);
无效处置();
IQueryable GetAll();
IQueryable GetAll(对象过滤器);
TEntity GetById(对象id);
TEntity GetFullObject(对象id);
IQueryable GetPaged(int-top=20,int-skip=0,object-orderBy=null,object-filter=null);
无效插入(TEntity实体);
无效更新(潜在实体);
}
接口2:

public interface IThirdWaveRepositoryBase<TEntity> where TEntity : class
{
    IQueryable<TEntity> GetAll();
    IQueryable<TEntity> GetAll(object filter);
    TEntity GetById(object id);
    TEntity GetFullObject(object id);
    IQueryable<TEntity> GetPaged(int top = 20, int skip = 0, object orderBy = null, object filter = null);
}
公共接口ITIRDWaveRepositoryBase,其中tenty:class
{
IQueryable GetAll();
IQueryable GetAll(对象过滤器);
TEntity GetById(对象id);
TEntity GetFullObject(对象id);
IQueryable GetPaged(int-top=20,int-skip=0,object-orderBy=null,object-filter=null);
}

您或许可以将IRepositoryBase分离为多个较小的接口。例如,您可以拥有以下内容:-

public interface UnitOfWork<TEntity> : IDisposable
  where TEntity : class
{
    void Commit();
}

public interface IDeletableRepositoryBase<TEntity> : IDisposable
  where TEntity : class
{
    void Delete(object id);
    void Delete(TEntity entity);
}

public interface IGetRepositoryBase<TEntity> : IDisposable
  where TEntity : class
{
    IQueryable<TEntity> GetAll();
    IQueryable<TEntity> GetAll(object filter);
    TEntity GetById(object id);
    TEntity GetFullObject(object id);
    IQueryable<TEntity> GetPaged(int top = 20, int skip = 0, object orderBy = null, object filter = null);
}

public interface IUpsertRepositoryBase<TEntity> : IDisposable
  where TEntity : class
{
    void Insert(TEntity entity);
    void Update(TEntity entity);
}

public interface IThirdWaveRepositoryBase<TEntity> : IDisposable, IGetRepositoryBase<TEntity>
  where TEntity : class
{

}
公共接口工作单元:IDisposable
地点:班级
{
无效提交();
}
公共接口IDeletableRepositoryBase:IDisposable
地点:班级
{
作废删除(对象id);
无效删除(潜在实体);
}
公共接口IGetRepositoryBase:IDisposable
地点:班级
{
IQueryable GetAll();
IQueryable GetAll(对象过滤器);
TEntity GetById(对象id);
TEntity GetFullObject(对象id);
IQueryable GetPaged(int-top=20,int-skip=0,object-orderBy=null,object-filter=null);
}
公共接口IUpsertRepositoryBase:IDisposable
地点:班级
{
无效插入(TEntity实体);
无效更新(潜在实体);
}
公共接口ITIRDWaveRepositoryBase:IDisposable,IGetRepositoryBase
地点:班级
{
}

我建议如下:

public interface IRepositoryReadOnly<TEntity> : IDisposable where TEntity : class
{
    IQueryable<TEntity> GetAll();
    IQueryable<TEntity> GetAll(object filter);
    TEntity GetById(object id);
    TEntity GetFullObject(object id);
    IQueryable<TEntity> GetPaged(int top = 20, int skip = 0, object orderBy = null, object filter = null);
}

public interface IRepository<TEntity> : IRepositoryReadOnly<TEntity> where TEntity : class
{
    void Delete(object id);
    void Delete(TEntity entity);

    void Insert(TEntity entity);
    void Update(TEntity entity);

    void Commit();
}
公共接口IRepositoryReadOnly:IDisposable其中tenty:class
{
IQueryable GetAll();
IQueryable GetAll(对象过滤器);
TEntity GetById(对象id);
TEntity GetFullObject(对象id);
IQueryable GetPaged(int-top=20,int-skip=0,object-orderBy=null,object-filter=null);
}
公共接口IRepository:IRepositoryReadOnly其中tenty:class
{
作废删除(对象id);
无效删除(潜在实体);
无效插入(TEntity实体);
无效更新(潜在实体);
无效提交();
}

void Dispose()成员已消失,因为添加了
IDisposable
接口。

为什么第一个接口不能继承(扩展)第二个接口?你试过什么?你到底不明白什么?@PeterDuniho,我只是在学习接口。现在我只是使用它们,因为我在视频中被告知要使用它们。我试图完全理解他们。从我对代码中tenty:Class的理解来看,我不能从另一个接口中固有?我说的不对吗?因为如果我加上另一个:我只是得到一个错误“根据我的理解,因为我的代码中的tenty:Class,那么我不能从另一个接口中固有?我不对吗?”--你不对。如果您在堆栈溢出中搜索您收到的错误消息文本,您可能会找到如何完成此操作(提示:通用约束)。虽然存在重复,但我不一定要应用DRY,因为这也会给您带来麻烦。我会保持原样,如果它再次出现在另一个界面上,我会考虑你的设计。分解它的一种方法是只在一个接口中指向公共部分,并在类中实现这两个部分。这并不是说你不能,但它会带来一些无法避免的不一致性。