4

저는 합리적인 규모의 VB.NET 2.0 앱 (데이터 세트 포함)을 C# 4.5 (EF4 포함)로 마이그레이션하고 있습니다.EF4 complex Select() : 비즈니스 계층의 IEnumerable 또는 IEnumerable <MyCustomDto>을 반환 하시겠습니까?

우리의 "검색"기능은 다음과 같습니다. 이제는 EDMX에 정의 된 클래스의 IEnumerable을 반환합니다.

public IEnumerable<Product> GetProductsByCategory(int categoryId) 

그러나 우리의 EF4이 방법은 더 복잡한, 사용자 (익명) 유형을 생산하고있다 "()를 선택합니다"때 더 복잡하다 : 그래서 이런 일이 간단 결과에 대응하는 생성 된 클래스가 없습니다.

이 함수는 계층 경계 (Business to UI)를 넘어야하기 때문에 적절한 솔루션은이 쿼리에 대한 사용자 지정 형식을 정의한 다음 해당 형식의 IEnumerable을 반환하는 것이라고 생각했습니다. 예 :

public IEnumerable<ProductAccountSummary> GetProductAccountSummariesByCategory(int categoryId) 

여기에서 ProductAccountSummary은 손으로 제작 한 DTO (즉, POCO)이다.

그러나 코드 검토 중에 팀 리더가 내 접근 방식에 실패했습니다.

public IEnumerable GetProductAccountSummariesByCategory(int categoryId) 

.... 우리는 여전히 오버 헤드없이 등 우리의 UI 그리드에 IEnumerable을 결합 할 수있는 이유 DTO를 손-공예 : 그는 DTO를 삭제하고에 메소드 서명을 변경달라고 부탁이야 우리는 사용자 정의 유형을 사용해야 할 때마다

그래서 제 질문은 :

EF4에서
  • , 계층 경계를 넘어 사용자 정의 형식의 컬렉션을 전달하는 일반적인 방법은 무엇인가? IEnumerable (묵시적으로, "객체")을 반환하는 것은 나에게 맞는 것 같지 않습니다. 내가 놓친 게 있니?
+0

좋은 질문입니다. 필자는 항상 응용 프로그램 계층간에 DTO를 사용합니다. 왜 비 일반'IEnumerable'을 선택하겠습니까? – nrodic

+0

코멘트가없는 "-1"? 거친! 내 팀 리더가되어야합니다 :) – Merenzo

답변

4

팀 리드가 잘못되었다고 생각합니다. 강하게 유형화 된 객체를 다루는 것은 일반적으로 일을 처리하는 방법으로 간주됩니다. 이 접근법을 사용하면 다시 데이터 집합과 같은 유형으로 작업하는 세계로 돌아 왔습니다. 개체를 수정하고 비즈니스 계층으로 다시 전달해야하는 경우 장기간 유지 관리 작업이 필요할 것입니다. 비즈니스 계층에 아무것도 반환하지 않아도 클라이언트 측에서 유지 관리 문제가 발생할 수 있습니다.

예, DTO를 만드는 데 오버 헤드가 있지만 단기간의 속도가 결국 장기간 유지 관리 문제에 사용되지 않아야합니다.