데이터 가능 또는 DTO 또는 도메인 클래스 검색/보고를 선호하는 것은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/392806

문제

현재 내가 일하고있는 프로젝트에는 많은 Searhing/필터링 페이지가 필요합니다. 예를 들어, 데이터, 카테고리, 유닛으로 문제를 가져 오는 comlex 검색 페이지가 있습니다.

문제 도메인 클래스는 복잡하며 많은 가치 객체와 자식 객체가 포함되어 있습니다.

. 저는 사람들이 UI 검색/필터링/보고를 어떻게 처리하는지 궁금합니다. 내가 아는 한 나는 3 가지 옵션이 있지만 그들 중 누구도 나를 더 행복하게 만들지 않습니다.

1.) 매개 변수를 리포지토리/DAO로 보내서 DataTable을 가져 와서 UI 컨트롤에 데이터를 바인딩합니다.

DataTable dataTable =issueReportRepository.FindBy(specs);
.....
grid.DataSource=dataTable;
grid.DataBind();

이 옵션에서는 주어진 사양에 대한 도메인 계층 및 쿼리 데이터베이스를 전달하여 간단히 할 수 있습니다. 그리고 완전히 구성된 복잡한 도메인 객체를 얻을 필요가 없습니다. 값 객체, 자식 객체, .. 데이터베이스에서 직접 데이터 가능한 UI에 데이터를 표시하고 UI에 표시 할 필요가 없습니다.

그러나 UI와 같은 메소드 리턴 값에 계산 된 필드를 표시 해야하는 경우 도메인 객체가 완전히 없기 때문에 데이터베이스에서이를 수행해야합니다. 지능적인 등이없는 것과 같은 논리와 데이터 가능한 문제를 복제해야합니다 ...

2.) 매개 변수를 리포지토리/DAO로 보내 DTO를 가져 와서 DTO를 UI 컨트롤에 바인딩합니다.

IList<IssueDTO> issueDTOs =issueReportRepository.FindBy(specs);
....
grid.DataSource=issueDTOs;
grid.DataBind();

이 옵션에서는 위와 같지만 모든 검색 페이지에 대해 빈혈 DTO 객체를 만들어야합니다. 또한 다른 문제 검색 페이지의 경우 문제의 다른 부분을 표시해야합니다. Objects.issuesearchDto, CompanyIssueto, myissuedto ....

3.) 실제 저장소 클래스로 매개 변수를 보내려면 완전히 구성된 도메인 객체를 얻습니다.

IList<Issue> issues =issueRepository.FindBy(specs);
//Bind to grid...

나는 도메인 구동 디자인과 패턴을 좋아합니다. 이 옵션에는 DTO 또는 복제 로직이 없습니다. 그러나이 옵션에서는 UI에 표시되지 않는 많은 자식 및 가치 객체를 만들어야합니다. 또한 바늘에 대한 전체 도메인 개체 및 성능 비용을 얻으려면 많은 OB 조인이 필요합니다. 객체와 가치 객체.

이 버전에 대해 손으로 게으른로드를 구현할 수있는 ORM 도구를 사용하지 않지만 약간 과잉으로 보입니다.

어느 쪽을 선호합니까? 아니면 내가 잘못하고 있습니까? 이 작업을 수행하는 제안이나 더 나은 방법이 있습니까?

도움이 되었습니까?

해결책

몇 가지 제안이 있지만 물론 전반적인 대답은 "의존합니다"입니다.

먼저, ORM 도구를 사용해야합니다. 그렇지 않으면 그렇게하지 않아야 할 이유가 있어야합니다.

둘째, 게으른 하중 구현은 상대적으로 간단하므로 ORM 도구를 사용하지 않을 경우 다음과 같은 말을하는 객체에 속성을 만들 수 있습니다.

private Foo _foo;
public Foo Foo
{  
  get {  
         if(_foo == null)
         {
            _foo = _repository.Get(id);
         }
         return _foo;
       }
}

셋째, 성능은 처음에는 고려해야하지만 우아한 디자인에서 멀어지지 않아야하는 것입니다. 나는 당신이 (3) 처음에 사용해야한다고 주장하고 성능이 충분하지 않은 경우에만 벗어나야한다고 주장합니다. 이로 인해 코드가 가장 적은 코드를 작성하고 디자인에서 중복이 가장 적습니다.

성능이 고통받는 경우 게으른 하중을 사용하여 캐싱 및/또는 도메인 레이어를 사용하여 UI 계층에서 쉽게 해결할 수 있습니다. 둘 다 허용 가능한 성능을 제공하지 못하면 필요한 값 객체의 가벼운 컬렉션 만 전달하는 DTO 접근 방식으로 돌아갈 수 있습니다.

다른 팁

이것은 엄청난 질문과 나는 또한 내 대답을 제공하고 싶었습니다. 제 생각에는 기술적으로 최고 대답은 옵션 #3과 함께 이동하는 것입니다. 보고/검색 요청에 대한 향후 개선 사항을위한 확장 성과 함께 데이터를 가장 잘 설명하고 구성 할 수있는 기능을 제공합니다.

하지만 이것이 전반적인 최상의 옵션 일지 모르지만,보고 요구를 지원하는 데 필요한 모든 클래스와 관계에 대한 추가 설계 시간 인 다른 (2) 옵션이 있습니다 (다시는 없음이 없다는 전제에 따라 ORM 도구 사용).

나는 많은 응용 프로그램에서도 이것으로 어려움을 겪고 있으며 현실은 #2가 시간과 디자인 사이의 가장 큰 타협이라는 것입니다. 이제 당신이 당신의 버스 나이즈 물건과 그들의 모든 필요에 대해 묻고 있다면 아니요 완전히 배치되고 올바르게 설계된 모델이 중요하며 대체물이 없다는 질문입니다. 그러나보고하고 이것을 찾는 것은 다른 동물입니다. #2는 빈혈 클래스에서 강력하게 입력 된 데이터를 제공하며 #1과 같은 데이터 세트의 하드 코드 값만큼 원시적이지 않으며 #3에 비해 설계를 완료하는 데 필요한 시간을 크게 줄입니다.

이상적으로는 모든보고 요구 사항을 포함하기 위해 객체 모델을 확장하고 싶습니다. 그러나 때로는이 작업에 필요한 노력이 너무 광범위하여보고 요구 사항에 대한 별도의 클래스 세트를 만드는 것이 더 쉽지만 여전히 실행 가능한 옵션입니다. 나는 실제로 몇 년 전에이 동일한 질문을 거의 물었고 또한보고 요구에 대한 다른 수업 (본질적으로 DTO)을 만드는 것은 나쁜 선택이 아니라고 들었습니다.

따라서 #3은 기술적으로 최선의 선택이지만 복잡한보고 및 검색 요구를 위해 시간과 품질을 함께 고려할 때 #2는 아마도 가장 현실적이고 실행 가능한 옵션 일 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top