2016-10-25 2 views
3

나는 매우 비슷하지만 계층적인 엔티티가 4 개 있습니다. 각각은 이전에 대한 외래 키를 가지고 있으며 다음 키의 콜렉션을 포함합니다. 각각에 대해 약간 다르고 두 방법저장소 패턴 : 동일한 저장소 다루기

Repository

구현 :

Part of entity

지금, 이러한 엔티티는 4 명 개의 동일한 저장소를 갖는다.

필요에 따라 기능을 확장하면서 동시에 4 개 모두를 하나로 병합 할 수있는 디자인 패턴이 있습니까?

나는이 작업을 수행하려고 :

public class DivisionRepository : IDivisionRepository 
{ 
    private DbContext dbContext; 
    private IDbSet<PrimaryDivision> primaryDivisionsEntitySet; 
    private IDbSet<SecondaryDivision> secondaryDivisionsEntitySet; 
    private IDbSet<TertiaryDivision> tertiaryDivisionsEntitySet; 
    private IDbSet<QuaternaryDivision> quaternaryDivisionsEntitySet; 

    public DivisionRepository(DbContext dbContext) 
    { 
     this.dbContext = dbContext; 
     this.primaryDivisionsEntitySet = dbContext.Set<PrimaryDivision>(); 
     this.secondaryDivisionsEntitySet = dbContext.Set<SecondaryDivision>(); 
     this.tertiaryDivisionsEntitySet = dbContext.Set<TertiaryDivision>(); 
     this.quaternaryDivisionsEntitySet = dbContext.Set<QuaternaryDivision>(); 
    } 

    public IDivision Find(Type type, object id) 
    { 
     if (type == typeof(PrimaryDivision)) 
     { 
      return this.primaryDivisionsEntitySet.Find(id); 
     } 
     else if (type == typeof(SecondaryDivision)) 
     { 
      return this.secondaryDivisionsEntitySet.Find(id); 
     } 
     else if (type == typeof(TertiaryDivision)) 
     { 
      return this.tertiaryDivisionsEntitySet.Find(id); 
     } 
     else if (type == typeof(QuaternaryDivision)) 
     { 
      return this.quaternaryDivisionsEntitySet.Find(id); 
     } 

     throw new ArgumentException("The type provided was incorrect."); 

}

CRUD 작업이 비슷한 방식으로 계속합니다.

그러나 가장 최적의 솔루션처럼 보이지 않았으므로 이제 인터페이스와 클래스 (예 : 저장소 당 2 개)의 혼란으로 되돌아갔습니다.

+0

그들은 분리되어 있어야합니다. 우려의 분리. 단일 책임 원칙. 바로 지금 그들은 밀접하게 관련되어 있지만 미래에는 누가 압니다. 그때까지는 리팩터링과 재 작성없이 너무 빨리 분리 할 수 ​​없습니다. –

+0

이것은 Entity framework query builder에 대한 질문과 같습니다. 그렇습니다.하지만 모든 시간과 노력의 가치가 있습니다. 대부분의 경우 그렇지 않습니다. 그러나 어이, 아직도 재미있는 질문. –

답변

2

나는이 나는 composable repository 부르는 사용을 할 것 감사드립니다.

public static T SpecialFind(this IQueryable<T> entities, int id) where T: IDivision 
{ 
    return entities.FirstOrDefault(x=>x.Id == id); 
} 

사용 :

ctx.TertiaryDivisions.SpecialFind(1); 

이 일의 장점이 특히 더 복잡한 시나리오와, 정말 멋진 재사용 패턴을 제공한다는 것입니다. 당신이 절대적으로 저장소 패턴에 설정되어있는 경우

그러나 동일한 기본 교장이 적용

public T Find<T>(object id) where T : IDivision 
{ 
    return dbContext.Set<T>().Find(id); 
} 

는 다른 방법으로는 전체 저장소에 일반을 넣을 수 있습니다.