Как использовать модель представления в 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 должен содержать код, относящийся только к этому представлению. Он не должен содержать никаких "базовых" функций, таких как загрузка данных, если эти данные нужны в другом месте приложению.