2017-11-02 3 views
-1

동일한 메소드가 많은 인터페이스가 두 개 있으며 DRY 원칙을 위반하는 것으로 보입니다. 인터페이스에서 이러한 중복 메소드가없는 곳에서 어떻게 얻을 수 있습니까? 또는 인터페이스에 문제가되지 않습니까?2 개의 거의 동일한 인터페이스로 무엇을할까요?

인터페이스 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); 
} 

인터페이스 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); 
} 
+0

첫 번째 인터페이스가 두 번째 인터페이스를 상속 (확장) 할 수없는 이유는 무엇입니까? 너 뭐 해봤 니? _specifically_ 무엇을 알아낼 수 없습니까? –

+0

@PeterDuniho, 나는 인터페이스에 대해 배우는 중이다. 지금 나는 그들을 사용하는 비디오에서 들었 기 때문에 나는 단지 그것을 사용한다. 나는 그들을 완전히 이해하려고 노력하고있다. '내가 어디에서 Tentity : Class'를 사용했는지 알기 때문에 다른 인터페이스에서 본질적으로 사용할 수 없습니까? 내가 옳지 않은가? 왜냐하면 만약 내가 다른 사람을 넣는다면 : 나는 단지 오류가 발생합니다. – djblois

+0

_ "내가 이해할 수있는 것 때문에 어디에서 텐트 : 코드의 코드가 다음에 다른 인터페이스에서 내재되어있을 수 없습니까?"- 당신이 옳지 않습니다. 얻는 오류 메시지의 텍스트에 대해 스택 오버플로를 검색하면이를 달성하는 방법 (힌트 : 제네릭 제약 조건)을 찾을 수 있습니다. –

답변

0

당신은 아마도 여러 개의 작은 인터페이스로 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 
{ 

} 
0

:

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

void Dispose(); 회원이 때문에 IDisposable 인터페이스 또한 사라졌다했습니다.