2010-04-06 1 views
0

Linq to SQL은 IQueryable이고 관계로 가득 찬 개체를 생성합니다.
Html 도우미는 IEnumerable<SelectListItem>과 같은 특정 인터페이스 개체가 필요합니다.Linq to SQL, Repositories 및 Asp.Net MVC ViewData : 중복을 제거하는 방법?

내가 일어날 수 있다고 생각 :

  • 는 재사용 Linq에의 객체 즉, 추가 도메인 모델 클래스없이 SQL 오브젝트에 Linq에에서 포항 강판을 반환, 모든 수하물없이 SQL로?
  • SelectListItem 열거 형과 같은 HTML 도우미 개체로 쉽게 변환되는 개체를 추출 하시겠습니까?

우려를 분리하지 않고이를 수행 할 수있는 방법이 있습니까? 요구를 연결하는 몇 가지 단서로운 트릭?

예를 들어 저장소에있는 경우 SelectListItem이 표시되지 않습니다. select new는 짐없이 SQL로 Linq의에서 개체를 잘라 좋은 방법이지만 여전히 참조해서는 안 클래스 참조 할 것 : (당신이 ToSelectListItem을 만들 수있는이 특정 예에서

IEnumerable<SelectListItem> result = (from record in db.table 
             select new SelectListItem { 
              Selected = record.selected, 
              Text= record.Text, 
              Value= record.Value } 
            ).AsEnumerable(); 
+1

MVVM 패턴 (http://en.wikipedia.org/wiki/Model_View_ViewModel)을 사용하고 도메인 모델을 UI까지 노출시키지 않아야 할 수도 있습니다. 다음은 http://stackoverflow.com/questions/2581490/should-business-objects-beable-to-create-their-own-dtos/2581636에 대한 다소 관련있는 스레드입니다. – R0MANARMY

답변

2

나는 IService 인터페이스와 서비스 클래스의 사용자를 보았다. 기본적으로 저장소와 컨트롤러 사이의 단계입니다.

장점 :

  • 저장소가 포함되기 전에 검증 로직이 사는 다리가 될 수 IRepository 행동의 우려
  • 좋은 분리를 반환 값을 조작하는 방법을 허용합니다. 코드의

    • 무초 중복 :
    • 는/패턴

    단점 의존성 주입 프레임 워크로 작업 할 수 있습니다. 저장소를 노출하지 않는 한 IService에서 거의 모든 IRepository 메서드를 복제 할 것입니다.

  • "포괄적 인"클래스가 될 수 있습니다. 모든 것을하는 신의 계급! Muahahaha ... etc

나는 더 많이 본다. 그러나 그것은 내가 보아 왔고 사용한 것이다.

1

을) 메소드 또는 유사 클래스를 사용하여 중복을 제거하십시오. 아니면 확장 메소드가 거기에 어떤 연결을 피하는 것이 더 나을 것입니다.

편집 : 일반적으로 DTO가있는 JSON 웹 서비스를 사용합니다. 필자의 제품 L2SQL 엔티티에 대한 JSON 친화적 인 표현 인 ProductDto가있을 수 있습니다. 그런 다음 쿼리에서 Select ProductDto.FromProduct (product)를 호출하기 만하면됩니다. 복제가 최소화되었습니다.

+0

누군가 필요한 정보에 따라 완전한 엔터티보다 적은 값을 반환하는 특별한 리포지토리 메서드를 제안했습니다. 이 방법은 제품이지만 이름과 ID 만 있으면 이름과 ID 만 채워집니다. –

+0

다른 사람이 서버에서 JSON 객체를 캐싱하고 클라이언트가 "dirty"또는 변경된 속성 만 보내고 마지막으로 캐싱 된 객체를 변경된 속성과 일치 시키도록 제안했습니다. 클라이언트 측에서이 기술을 사용해 본 적이 있습니까? 소프트웨어는 무엇입니까? MS의 Jquery 템플릿 제안 베타? –