Инициализируйте программу правильно, используя MVVM - PullRequest
0 голосов
/ 16 марта 2020

Я баловался с MVVM. На самом деле, я неукоснительно пытался следовать его правилам и рекомендациям.

Как правильно обрабатывается инициализация программы?

В частности, я не совсем понимаю, почему вы сначала вызовет представление (из App.xaml).

Мои предположения заключаются в том, что контроллер все еще владеет абстракцией представления (ViewModel) и использует его для обновления представления. (Я предпочитаю разделять представление и обработку на разные классы, которые, я думаю, могли бы сделать это "MVVM C"). Поэтому, на мой взгляд, представление не должно быть первым, что нужно инициализировать. При этом мое решение состояло в том, чтобы запустить контроллер из кода приложения app.xaml и передать ViewModel в контроллер.

Несмотря на то, что я получаю хорошую информационную линию, у меня такое ощущение, что это не правильный путь, так как я все еще использую код приложения app.xaml.

Вот как выглядит мое приложение:

Итак, каков наилучший / наиболее эффективный / наиболее приемлемый способ инициализации приложения?

1 Ответ

1 голос
/ 16 марта 2020

Прежде всего, MVVM не является очень строгим набором правил и определенно оставляет место для широкого спектра вкусов.

В зависимости от того, создан ли сначала View или ViewModel, вы можете различить два подхода:

  1. Первый подход ViewModel , где сначала создается экземпляр ViewModel, а затем обычно на основе некоторого соглашения выбирается View. DataTemplateSelector является хорошим примером.

  2. Представление сначала подход, где представление создается первым (обычно Window или UserControl) и выбирается какое-то условное представление. Это может быть обязанностью View создать собственный экземпляр ViewModel, или он может быть делегирован кому-то другому.

Когда дело доходит до инициализации, это всегда должно быть сделано в приложении .xaml или app.xaml.cs, поскольку это точка входа для вашего приложения. Вы также должны понимать, что процесс подачи заявки связан с Dispatcher l oop. Когда последнее окно в вашем приложении закрыто, диспетчерский цикл завершается, и процесс приложения завершается. Последнее окно обычно является MainWindow.

Кроме того, учитывайте время запуска приложения. Вы хотите отобразить некоторые окна как можно скорее. Поэтому, если вы хотите сделать какую-либо логи c до того, как появится окно, убедитесь, что вы не выполняете никаких операций ввода-вывода, вызовов базы данных или API, и т.д. c.

У меня обычно есть Bootstrapper. класс CS, который я вызываю из App.xaml.cs. В его обязанности входит настройка Io C и отображение интерфейса пользователя. Это может быть окно загрузки, а затем MainWindow.

В Bootstrapper.cs вы можете сначала создать экземпляр MainWindowViewModel, создать MainWindow и назначить ViewModel его DataContext, либо вы можете просто создать MainWindow и оставить создание ViewModel. до самого главного окна. Я склонен делать последнее.

Нет ничего плохого ни в одном из подходов, и ни один из них не нарушает принцип MVVM.

Моя самая большая рекомендация для вас - если вы не можете выбрать между двумя или больше вариантов, выберите более простой. Или, другими словами, не усложняйте вещи, если у вас нет очень веских причин для этого. KISS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...