Как использовать модель представления в MVVM?

Я разрабатываю приложение для Windows Phone 7 и слышал, что шаблон MVVM полезен. Я прочитал много статей и вопросов на этом сайте, но все, что я получил, - это объяснение модели представления как моста между представлением и моделью. Если модель - это класс Customer, то модель представления считается коллекцией клиентов, используемой для привязки данных. Это очень простое использование!

Если я хочу загрузить клиентов из сети, показать их в представлении, а затем сохранить их в локальной базе данных, должен ли я поместить весь этот логический код в модель представления?

2 ответа

Решение

Нет, не стоит читать про разделение интересов. Вам нужно изменить только одну причину для каждого из ваших классов: модель представления должна отвечать только за перевод информации модели, представляемой в представлении.

Отдельная реализация сервиса должна отвечать за получение экземпляров модели из вашего хранилища данных.

Например:

public class MyViewModel
{
    private readonly ICustomerRetrieval _retrievalService;

    public MyViewModel(ICustomerRetrieval retrievalService)
    {
        _retrievalService = retrievalService;
    }

    public IEnumerable<CustomerViewModel> Customers
    {
        get { return _retrievalService.GetAllCustomers().Select(AsViewModel);
    }

    private CustomerViewModel AsViewModel(CustomerModel cust)
    {
        return new CustomerViewModel(cust);
    }
}

Вы можете видеть, что служба отвечает за поиск моделей клиентов, а модель представления просто отвечает за их преобразование в пользовательский интерфейс.

Если я хочу загрузить клиентов из сети, показать их в представлении, а затем сохранить их в локальной базе данных, должен ли я поместить весь этот логический код в модель представления?

Если логика "загрузки клиентов из сети" специфична для представления и только для этого представления, то имеет смысл поместить его в эту ViewModel.

Если загрузку клиентов нужно разделить с другими представлениями, то, возможно, вам следует разместить ее на уровне данных, который загружается при запуске или в фоновом режиме.

ViewModel должен содержать код, относящийся только к этому представлению. Он не должен содержать никаких "базовых" функций, таких как загрузка данных, если эти данные нужны в другом месте приложению.

Другие вопросы по тегам