Я писал все свои приложения MVVM с базовым шаблоном проектирования, обычно упоминаемым в примерах MVVM, доступных в Интернете. Шаблон, которому я следую, описан ниже:
Модель
Этот раздел включает классы DTO с их свойствами и интерфейсами IDataService и тому подобное:
public class Employee
{
public string EmployeeName { get; set; }
public string EmployeeDesignation { get; set; }
public string EmployeeID { get; set; }
}
public interface IDataService
{
public Task<Employee> GetEmployeeLst();
}
Прокси
Этот уровень содержит вызовы Dataservice, которые реализуют IDataservice, например:
public class DataService : IDataService
{
public async Task<Employee> GetEmployeeLst()
{
// Logic to get employee data from HTTPClient call
}
}
Модель представления
Этот слой содержит ViewModel и ссылку на уровень Model и Proxy, из которого получены все данные:
public class BaseViewModel
{
public BaseViewModel(INavigationService nav, IDataService data, IAESEnDecrypt encrypt, IGeoLocationService geoLocation, IMessageBus msgBus, ISmartDispatcher smtDispatcher)
{
}
// This also include common methods and static properties that are shared among most of the ViewModels
}
Все ViewModel наследует BaseViewModel. Каждая модель представления также содержит команду делегата, которая выполняется, когда пользовательский интерфейс запускает событие. Который затем извлекает данные с сервера, вызывая DataService на уровне прокси, выполняет бизнес-логику и заполняет свойства в ViewModel, которые привязаны к представлению. Для каждого представления существует виртуальная машина, привязанная к контексту данных представления. ViewModel также отвечает за запуск анимации. Я использовал триггер для запуска раскадровки, которая привязана к моим перечислениям в виртуальной машине для изменения состояния этих триггеров, как в примере: http://www.markermetro.com/2011/05/technical/mvvm-friendly-visual-state-management-with-windows-phone-7/
Просмотреть
На этом уровне у меня есть все мои представления, пользовательские элементы управления и бизнес-логика с реализацией определенных зависимостей, таких как служба геолокации, шифрование AES, служба навигации между представлениями и т. д.
Каждое представление имеет файлы .xaml и .xaml.cs. В файле .xaml.cs я связал контекст данных представления с виртуальной машиной следующим образом:
this.DataContext = App.IOConatiner.GetInstance<DashboardViewModel>();
и с этого момента происходит всякое связывание.
Моя проблема в том, что недавно я узнал, что этот шаблон не соответствует шаблону проектирования SOLID, о котором я узнал в этом ответе на мой вопрос: Простой инжектор внедряет несколько зависимостей в базовый класс
Я очень стараюсь изменить свой дизайн в соответствии с предложением, данным в ответе на мой предыдущий вопрос. Но я не могу получить некоторые вещи, такие как:
В настоящее время View Datacontext привязан к ViewModel, поэтому все элементы управления контролируются свойством в виртуальной машине. Как бы я изменил это на ваш вышеупомянутый шаблон с помощью Processor/Service или DialogHandler?
Я использую Delegatecommands, которые привязаны к свойству команды элемента пользовательского интерфейса. При выполнении этой команды происходит определенное действие, например, анимация, отображается пользовательский контроль. Как это сделать в шаблоне команды?
Как я могу начать изменять свою текущую реализацию, чтобы приспособить все эти изменения наилучшим образом?
BaseViewModel
. Это первый шаг. Это мгновенно покажет вам, какие службы требуются для каждой виртуальной машины. Затем вы можете следовать примеру, приведенному в этом очень подробном ответе. - person qujck   schedule 09.02.2015