фильтрация репозитория mvvm - PullRequest
2 голосов
/ 23 мая 2011

У меня есть несколько мастер-классов, основанных в основном на статье msdn Джоша Смита . Его отличный код, особенно для примера, но заставляет меня задуматься, как лучше всего справляться с ситуациями, когда вам нужно какое-то подмножество хранилища.

Итак, у Джоша есть класс, называемый 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 для решения подобных проблем?

Приветствия
Berryl

1 Ответ

1 голос
/ 23 мая 2011

Один из вариантов (и, возможно, самый чистый) состоит в том, чтобы просто добавить эти методы в CustomerRepository - например, GetPreferredCustomers(), GetLocalCustomers() и т. Д.

Кроме того, вы действительно должны работать против абстракций, поэтомудолжен передать ICustomerRepository вашему конструктору модели представления.Это отделяет ваш код модели представления от вашего конкретного клиентского репозитория (в данном случае тот, который читает из XML-файла) и позволяет легко менять реализации, например, для модульного тестирования.

Другой вариант, как выупомянуть, для вашего хранилища выставить IQueryable<T>.Если вы счастливы быть связанными с IQueryable и уверены, что любая реализация доступа к данным будет поддерживать поставщика LINQ, то это обеспечивает хорошую гибкость.См. здесь для получения дополнительной информации.

Лично я предпочитаю первый вариант, особенно для более масштабных приложений.

...