문제

나는 Josh Smith의 내용을 대부분 기반으로 한 몇 가지 마스터-디테일 수업을 가지고 있습니다. msdn 기사.특히 예제의 경우 훌륭한 코드이지만 저장소의 일부 하위 집합이 필요한 상황을 가장 잘 처리하는 방법이 궁금합니다.

따라서 Josh에는 AllCustomersViewModel이라는 클래스가 있고 다음과 같은 코드가 있습니다.

    public AllCustomersViewModel(CustomerRepository customerRepository)
    {
        if (customerRepository == null) throw new ArgumentNullException("customerRepository");

        // Populate the AllCustomers collection with CustomerViewModels.
         _allCustomers = _customerRepository
            .GetCustomers()
            .Select(cust => new CustomerViewModel(cust, _customerRepository))
            .ToList();
   }

PreferredCustomers, ExCustomers, LocalCustomers 등을 원하는 상황을 어떻게 해결합니까?

그의 코드는 각 클래스에 하드 코딩된 저장소 필터링을 포함하는 ViewModel 클래스를 제안합니다.

아니면 저장소와 함께 선택적 필터를 ViewModel에 전달하는 방법이 있습니까?

귀하의 코드는 이 특정 문제를 어떻게 해결합니까?

여담이지만 SpeciaficationPattern 또는 IQueryable을 사용하여 이와 같은 문제를 해결하는 방법을 보여주는 링크나 좋은 예가 있는 사람이 있습니까?

건배,
베리엘

도움이 되었습니까?

해결책

한 가지 옵션(아마도 가장 깔끔한)은 해당 메서드를 간단히 추가하는 것입니다. CustomerRepository - 예를 들어 GetPreferredCustomers(), GetLocalCustomers() 등.

또한 실제로 추상화에 맞서 작업해야 하므로 ICustomerRepository 뷰 모델 생성자에.이렇게 하면 구체적인 고객 저장소(이 경우 XML 파일에서 읽는 저장소)에서 뷰 모델 코드가 분리되고 구현을 쉽게 교체할 수 있습니다.단위 테스트용.

언급한 것처럼 다른 옵션은 저장소를 노출시키는 것입니다. IQueryable<T>.IQueryable에 연결되어 기쁘고 모든 데이터 액세스 구현이 LINQ 공급자를 지원할 것이라고 확신한다면 이는 뛰어난 유연성을 제공합니다.보다 여기 더 많은 정보를 위해서.

개인적으로 저는 특히 대규모 애플리케이션의 경우 첫 번째 옵션을 선호합니다.

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