Я начал изучать Redux и React в веб-мире, и чем больше я узнаю об этом, тем больше осознаю, насколько болезненным является управление состоянием в настольном мире с архитектурой в стиле MVF в WPF (специально использующей Caliburn для привязки Views). для ViewModels).
Redux имеет несколько простых принципов, которые определяют порядок управления состоянием, делая обновления пользовательского интерфейса, обработку событий и изменения состояния гораздо более предсказуемыми. Принципы:
- Единственный источник правды (все изменяемые состояния хранятся в одном общем объекте).
- Состояние только для чтения. Он не может быть изменен компонентами по всему коду, что обычно происходит в WPF.
- Состояние может быть изменено только чистыми функциями.
Архитектура MVFM в WPF позволяет очень быстро создавать интерактивные представления, но отладка проблем, когда различные модели и события всех состояний изменяют состояние, является кошмаром. Например: произошло событие, которое изменило представление и попыталось установить вкладку по умолчанию, но данные не завершили асинхронную загрузку из веб-службы, поэтому вкладка не существует (пока), поэтому ничего не происходит
Я потратил часы на рисование диаграмм, чтобы попытаться понять сложные взаимодействия между взаимосвязанными компонентами viewModels, которые обновляют друг друга.
Я понимаю, что Redux стремится решить некоторые из этих состояний непредсказуемости. Есть ли что-то похожее или архитектурный шаблон, который бы прекрасно подходил для WPF, чтобы помочь лучше управлять состоянием? Я не уверен, насколько хорошо принципы Redux будут работать в .NET, так как я еще не пробовал их. Возможно, у кого-то есть опыт, который может дать совет?
Ответы:
Я думаю, я знаю, что вы имеете в виду. По сути, вы решаете проблему, добавляя либо «контроллер», либо «мастер» модель представления (извините, псевдокод)
т.е.
когда вы делаете это с Паттерном посредника, я думаю о классе как о контроллере. то есть.
Подобные вещи позволяют вам помещать вашу «логику потока» или «оркестровку событий» в эти постоянные классы высокого уровня и сохранять код ВМ легким. Если вы хотите изменить «когда пользователь нажимает кнопку« КУПИТЬ », заказ обрабатывается - то, что вы знаете, смотрите в« OrderFlowController »или« OrderProcessVM »или как бы вы ни назвали их. Вместо комбинации BasketVM, PaymentVM, 3dSecureVM и т. Д. И т. Д.
Так что в вашем конкретном примере «вкладка еще не готова» вы могли бы иметь
источник