2009-11-20 2 views
3

IRepository 패턴을 사용하여 관계형 데이터를 처리 할 때 권장되는 방법이 무엇인지 궁금합니다.IRepository 및 관계형 데이터

내 데이터베이스는 괄호 안의 열 이름 다음과 같은 테이블이 있습니다

  • 계획 (PLANID, 이름,에서 CreationDate, ModifiedDate,는 viewId)
  • 지역 (AreaId, 이름, NTOP, nLeft, nRight , nBottom)
  • 뷰 (는 viewId, NTOP, nLeft, nRight, nBottom)
  • PlanAreas을 (PLANID, AreaId)

각 계획에는 0 개 또는 여러 개의 영역이 있지만 하나의보기 만있을 수 있으므로 Plans.ViewId는 FK to Views.ViewId입니다. PlanAreas에서 두 열은 각각의 테이블에 대해 FK입니다.

내 응용 프로그램이 해당 영역에서 독립적으로 작동하고 싶을 수도 있지만 일반적으로 계획과 모든 구성 요소 (영역, 뷰)를 동시에로드, 저장, 삭제할 것입니다.

나는

public interface IPlanRepository 
{ 
    IEnumerable<MyModel.Plan> GetAll(); 
    MyModel.Plan GetByName(string sName); 
    MyModel.Plan GetById(string sId); 
    void Delete(MyModel.Plan plan); 
    void SaveOrUpdate(MyModel.Plan plan); 
} 

public class Plan 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public DateTime Creation { get; set; } 
    public DateTime Modified { get; set; } 
    public MyModel.View View { get; set; } 
    public IList<MyModel.Area> Areas { get; set; } 
} 

public class View 
{ 
    public Guid Id { get; set; } 
    public IEnvelope Envelope { get; set; } // encapsulates top, left, bottom, right 
} 

// etc. 

계획은 상당히 복잡하다 .... 경로를 아래로 시작했습니다, 그래서 실제로 이상의 속성이있을 것이다, 그러나 이것은 좋은 시작이다. 이제 질문에 대한 :

  • IViewRepository 및 IAreaRepository가 필요합니까?
  • IPlanRepository에서 메소드를 구현할 때 플랜 (예 : 영역 및 뷰)에 연결된 관계형 데이터를 가져 와서 완전히 채워진 Plan 객체를 반환하는 작업을 모두 수행합니까?
  • 플랜이 반환되면 속성을 채울 높은 수준의 "집계 도구"(더 나은 단어가 부족한 경우)가 더 좋습니까? 이런 식으로 뭔가 : 나는 그것을 잘 알고있어, 나는 상당히 빨리 그것을 할 수 있기 때문에

Plan GetPlanById(string sId) 
{ 
    Plan myplan = new Plan(); 
    IPlanRepository planrepo = new PlanRepoImpl(); 
    myplan = planrepo.GetById(sId); 
    IViewRepository viewrepo = new ViewRepoImpl(); 
    myplan.View = viewrepo.GetByPlanId(sId); 
    return myplan; 
} 
가 지금 내 데이터 액세스를 위해 LINQ-SQL을 사용하여 계획입니다. 나는 라인의 아래 다른 것, 그러나 그것을 지금 간단하게 지키고 싶다 전환 할지도 모른다.

+0

왜 저장소 패턴이 필요합니까? Linq2Sql 컨텍스트를 사용하지 않는 이유는 무엇입니까? –

+0

일반적인 문제에 대한 최선의 접근법이 없기 때문에 묻습니다. 구체적인 문제에 대한 최선의 접근법이 있습니다. 그리고 정확히 무엇이 필요한지 구체화해야합니다. –

+0

LINQ-SQL 컨텍스트가 데이터 액세스 클래스이고 내 데이터베이스 개체와 내 도메인 모델 개체 사이에 1 : 1 대응이 없기 때문에 또한 논리 레이어를 다시 작성하지 않고 데이터 액세스 전략을 변경할 수있는 유연성을 원합니다. –

답변

0

분명히 계획의 하위 부분에 대한 저장소가 필요하지 않습니다. 모델에 내부적으로 존재하기 때문에 직접 액세스 할 필요가 없으며 수행 한 경우 계획에 대한 참조가 필요합니다.

이 경우 플랜을 주요 참조 포인트로 사용하고자 할 수 있습니다. 전체 채워진 계획 오브젝트를 사용하면 연관된 지역 및 뷰에 대해 알고 싶은 모든 것을 찾을 수 있습니다.

EDIT : 나는 최근 에릭 에반스 (Eric Evans)가 DDD book을 읽었으며, 그의 저장소는 위에서 설명한 것과 비슷한 스타일을 사용했다.

+0

기본적으로 @bruno와 같은 대답이지만, 책의 참고 사항을 확인해주었습니다. 점수가 적기 때문에. –

1

Aggregate Root에 대해 하나의 저장소를 구현해야합니다. 그래서 여기에 하나의 저장소 만 있으면됩니다. 그리고 네, 저장소는 관련된 모든 데이터를 가진 엔티티를 작성해야 할 책임이 있다고 생각합니다.

2

계획의 하위 부분에 대해 리포를 수행하지 않으면 필요한 부분 만로드하는 방법은 무엇입니까? 예를 들어 시스템의 모든 계획 목록을 가져 와서 세부적으로 보려는 계획을 선택하려는 경우 요약 목록을 표시하기 위해 완전히 채워진 계획 개체를 반환하지 않으려 고합니다. 여러 가지면에서 성능이 저하됩니다. 대신에 당신은 린 (lean) 플랜 오브젝트와 어쩌면 그것이 얼마나 많은 영역 (전체 채워진 영역이 아닌)을 포함 할지를 계산할 수 있습니다. 또한,이 모든 것을 재사용 가능한 일반적인 방식으로 수행하기를 원할 것입니다.

나는 당신이 함께 일하고 싶은 각 주요 엔티티에 대한 별도의 저장소 개념에 의지 할 것입니다. 그런 다음 일종의 애그리 게이터를 통해 관계를 관리하십시오. 또는 집계 루트 repo의 각 검색 방법에 속성 참조 목록 및 연결된 대리자 (또는 식 트리)를 전달하여 채울 항목을 지정합니다. 하지만 여전히 2 수준, 3 수준, 4 수준 등의 문제가 있습니다. 계획 목록과 영역 수를 표시해야한다는 원래의 생각으로 돌아 가면 ... 모든 영역을 반환하여 계산을하기를 원하지 않을 것입니다.

그리고 검색 중입니다. 플랜에 5 개의 구역이 있고 각 구역에 일련의 봉투가 있고 구역에서 봉투를 추가, 편집 또는 삭제하기로 결정한 경우 어떻게됩니까? Plan 레벨에있을 때 업데이트 할 내용을 파악하기 위해 트리를 어떻게 걸으시겠습니까? Envelope와 Envelope Repo를 조작하는 것이 더 합리적 일 것입니다.

Repo는 데이터 검색을 처리하고 다른 엔진/클래스는 관계 픽스 업을 처리합니다.

관련 문제