У меня возникла небольшая анархитектурная проблема: я работаю над небольшим проектом, который, помимо прочего, включает в себя ввод и сохранение данных с помощью DAL, использующего веб-сервис с настраиваемым протоколом JSON. Пока все хорошо, и было бы относительно несложно собрать какой-нибудь быстрый и грязный DataTable
+ DataGrid
код и покончить с этим.
Однако это обучающий проект, и я пытаюсь понять, как сделать несколько более чистый дизайн, в частности MVVM с графическим интерфейсом WPF, используя платформу Caliburn.Micro. Серверная часть исправлена, но я делаю всю клиентскую часть, включая DAL.
С помощью комбинации DG + DT довольно легко внести кучу правок в DG, а когда пользователь фиксирует, просто повторяйте Rows
, проверяя свойство RowState
и запуская методы создания / обновления / удаления DAL по мере необходимости. DataTable
не кажется очень удобным для привязки данных MVVM, и задействованные модели ViewModels не должны заботиться о том, с каким типом управления пользовательским интерфейсом они используются ... учитывая, что постоянство осуществляется через веб-сервис, требующий пакетной фиксации изменений кажется Впрочем, достаточно разумно.
Итак, я обдумываю свои варианты дизайна.
Насколько я понимаю, DAL должен иметь дело с объектами уровня модели (я не думаю, что необходимо вводить DTO для этого проекта), и они будут заключены в ViewModels перед привязкой к данным в редакторе ViewModels.
Лучшая идея, которую мне удалось придумать до сих пор, - это сделать клон коллекции элементов, подлежащих редактированию, при запуске редактора ViewModel, а затем при фиксации, проверяя коллекцию привязок данных по копии - это будет позвольте мне обнаруживать новые / измененные / удаленные объекты, но это кажется несколько утомительным.
Я также поиграл с идеей сохранения свойств IsModified
и IsNewlyCreated
(я полагаю, они войдут в ViewModel?) - отслеживание удаленных элементов, вероятно, можно было бы обрабатывать, сохраняя редактируемые элементы в ObservableCollection
, обрабатывая событие CollectionChanged
и добавление удаленных элементов в отдельный список?
Как видите, я не знаю, как с этим справиться, и буду благодарен за любые предложения :)