mvvm 저장소 필터링
-
09-09-2020 - |
문제
나는 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 공급자를 지원할 것이라고 확신한다면 이는 뛰어난 유연성을 제공합니다.보다 여기 더 많은 정보를 위해서.
개인적으로 저는 특히 대규모 애플리케이션의 경우 첫 번째 옵션을 선호합니다.