MVVM, коллекции и ORM - PullRequest
       5

MVVM, коллекции и ORM

5 голосов
/ 10 декабря 2010

Я пытался использовать шаблон проектирования MVVM с WPF и Entity Framework для создания простого приложения.Все идет хорошо и хорошо, если классы слабо связаны, но если у меня есть что-то.как два модельных класса: Customer и Address, а у Customer есть коллекция адресов.

Теперь для этих классов мне нужно создать два класса VM - CustomerVM и AddressVM.CustomerVM должен иметь ObservableCollection объектов AddressVM.Каждое изменение, внесенное в эти классы ВМ (которое включает в себя все операции CRUD как в CustomerVM, так и в AddressVM), должно быть отражено в модельных классах - вот почему я заканчиваю тем, что пишу код, напримерподписывается на измененное событие ObservableCollection и, если добавляется новый объект, добавляет новый объект в модель ... и так далее ...

Что с этим делать?Это обычно при использовании MVVM?Я все делаю хорошо?Как сократить количество кода, необходимого для такой простой иерархии классов?Существуют ли какие-либо структуры, которые могут создавать базовые классы ВМ, которые «хорошо себя ведут» с другими классами в иерархии?Что делать, если отношения классов усложняются БОЛЬШЕ?

ИЛИ ПОСТАВИТЬ ЭТО ПРОСТО:

Как отразить изменения, сделанные в коллекциях VM в коллекциях моделей:вызвать эквивалент:

Customer1.Adresses.Add(new Address{City="New York"})

С другой стороны, существует та же проблема - как отразить изменения, внесенные в коллекции в модели для включения в модель представления, но меня больше интересует перваяодин, потому что он имеет более практическое применение, и объекты vm в большинстве случаев могут быть просто воссозданы.

Ответы [ 2 ]

1 голос
/ 11 декабря 2010

Вас может заинтересовать BookLibrary пример приложения WPF Application Framework (WAF) .Он показывает, как использовать Entity Framework и MVVM вместе.

Краткий совет: он не создает оболочку ViewModel для каждого класса Entity.Вместо этого он создает классы ViewModel для Views.

0 голосов
/ 10 декабря 2010

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

Один из вариантов - использовать ObservableCollections везде, даже в модели.Это не очень чистая архитектура, потому что MVVM не должен предъявлять какие-либо требования к модели.

Что я сделал, чтобы решить ее, так это представил Presenter, поэтому моя архитектура выглядит следующим образом:

View -> ViewModel <-> Presenter <-> Model

Также я сделал свои ViewModels немыми .Вот как типичное действие пользователя происходит от инициации до завершения:

  1. Пользователь нажимает кнопку Добавить
  2. ViewModel либо вызывает событие, на которое подписчик подписывается, либо вызывает метод дляPresenter, или просто вызывает обратный вызов, который Presenter предоставил ViewModel при создании ViewModel.По сути, он делегирует действие Presenter.
  3. Presenter вызывает Add для модели.
  4. Модель реагирует на вызов Add, обновляя все соответствующие состояния, включая обычноеcollection.
  5. Презентатор, выполнив действие над моделью, затем считывает новое состояние из модели и записывает состояние в ViewModel .Привязка обеспечивает синхронизацию представления.

Таким образом, в вашем случае Presenter может подписаться на событие CollectionChanged на ObservableCollection в ViewModel, и при его изменении он реагирует насобытие, позвонив Add на модель.С другой стороны, когда докладчик обрабатывает какое-то другое пользовательское действие, которое вызывает Add для модели (он знает, потому что он обрабатывает все взаимодействие с моделью), то он знает, что ему нужно распространить это изменение наObservableCollection в ViewModel.

В моем коде я упростил ситуацию ... после того, как каждое пользовательское действие выполняется на модели ведущим, я делаю прямую копиювсе соответствующие состояния в модели для соответствующего места во ViewModel.Вы выполняете немного больше работы, чем нужно, но в типичных приложениях типа CRUD заметных проблем с производительностью нет.Если у меня действительно большая коллекция объектов, производительность может быть проблемой, и там я перехожу к более детальной синхронизации (обновление только измененной сущности) за счет более сложной логики.

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