Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/76: Рейтинг темы: голосов - 76, средняя оценка - 4.55
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
WPF

MVVM бизнес логика и Model

02.11.2021, 00:10. Показов 16273. Ответов 132
Метки mvvm (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Я уже довольно долго пытаюсь разобраться что же представляет из себя архитектура MVVM, конкретно задачи View и ViewModel мне понятны. Но остается вопрос что из себя представляет Model? Много где есть определение Model = бизнес логика. Но как понять какую логику отнести к модели, а какую например к сервису.
К сожалению толкового ответа я не нашел, может плохо гуглил. В уроках обычно банальные примеры с расселением студентов по комнатам, что редко отображает реальное использование программы. На YouTube смотрел уроки по созданию MVVM приложению от Павла Шмачилина(https://www.youtube.com/watch?... P4&t=3630s), но именно про архитектуру он рассказывает не настолько подробно как хотелось бы.
Все что я понял это то что Model занимается некими правилами записи и получения данных из сервисов. Также предоставляет данные для ViewModel. Тоесть та самая бизнес логика (про нее я смотрел https://www.youtube.com/watch?v=9DW-xdwjop8) и преобразование данных. Но уверенности что я все понял как нужно, нет.
Ниже приведены примеры с которыми я сталкивался, но понятного для меня решения не нашел.

Первый пример
Пример как я это вижу:
На View есть Listbox и Button, Listbox заполняется данными из ссылки на ObservableCollection во ViewModel, которая получает их из сервиса хранящего эти данные. Button при нажатии должна очистить Listbox и заполнить его новыми данными. Model имеет ссылку на ObservableCollection из сервиса и представляет из себя только один метод который будет очищать данные в ObservableCollection и сообщать сервису о том что их надо заново сформировать и добавить в ObservableCollection.

Тоесть:
Нажатие кнопки => ViewModel вызывает в модели команду очистить список и заполнить его => Модель очищает список и просит чтоб сервис его заполнил => В ObservableCollection к которой прибинжен Listbox срабатывает уведомление об изменении коллекции и Listbox загружает новые данные из нее.

Вопрос: Нужна ли тут модель? Или ее функции может выполнить Viewmodel? Конкретно очистить список и сообщить сервису чтоб он его заполнил.


Второй пример
Второй пример:
Есть View на которой расположен Listbox в котором находятся данные о мониторах которые подключены к компьютеру. Эти данные загружает в себя сервис при запуске приложения. ViewModel имеет ссылку на данные из сервиса, View занимается их отображение в ListBox. Задача Listbox состоит не только в отображении данных, но и чтоб при двойном клике по Item в Listbox мы например отключили/включили монитор и поменяли прозрачность его иконки в Listbox.

Тоесть:
Двойной клик по Item в Listbox => ViewModel посылает в Model команду на отключение выбранного из ObservableCollection монитора => Model устанавливает для монитора флаг Activated = false и меняет прозрачность иконки монитора на Listbox (сигнализируя пользователю что монитор отключен), после этого сообщают сервису чтобы он отключил монитор.

Вопрос: Должна ли Model сообщить сервису чтоб он отключил монитор или это должна сделать ViewModel? Или тут вообще нет необходимости в Model, так как ViewModel может сама выполнить эти действия? Может быть что то из этого можно вынести в логику View?


Третий пример
Третий пример:
У нас на View есть CheckBox который при нажатии на него добавляет некоторые параметры в реестр, есть ViewModel которая при нажатии на CheckBox посылает команду в модель о том что нужно добавить параметр в реестр и проверяет успешно ли этот параметр добавился.

Тоесть:
Нажатие на CheckBox => ViewModel посылает команду о добавлении параметра, Model пытается добавить параметр в реестр и если параметр успешно добавлен то возвращает true, если доабвить не удалось то возращает false => ViewModel проверяет успешно ли добавлен параметр в реестр и устанавливает для CheckBox свойство isChecked в зависимости от полученного результата.

Вопрос: Нужно ли тут использовать Model или для этого используется сервис? Если используется Model, то что она должна в себе содержать? Логику добавления параметров в реестр? Или Model должна обращаться к сервису который будет эту логику содержать и получать от него только результат который потом передаст ViewModel?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.11.2021, 00:10
Ответы с готовыми решениями:

Model в MVVM
Доброго времени суток. Начал изучать MVVM и даже что-то получается сделать, но не могу сообразить, что должно быть в Model? Программа...

MVVM Model
Здравствуйте, у меня возник вопрос что должно хранится в моделе, теорию прочитал, но на практике не понимаю. Конкретно в моем вариант...

MVVM. Общение Model с ViewModel
Занимаюсь проектом WPF, первый раз пробую MVVM-паттерн. Успешно реализовал общение View и ViewModel (бинды, команды), но никак не могу...

132
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
04.11.2021, 20:34
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от xr_Sanya Посмотреть сообщение
C#
31
32
33
        // TODO: Синглтон я тут добавил для лучшего понимания как взаимодействовать с таким паттерном
        private static readonly Lazy<SettingsModel> Lazy = new(() => new SettingsModel());
        public static SettingsModel Source => Lazy.Value;
Можно, но довольно бессмысленно.
У вас этот класс используется от начала до конца сеанса приложения.
Занимает он в памяти - ну, килобайт может быть.
Зачем все эти выкрутасы?
Сделайте проще, привычнее:
C#
31
        public static SettingsModel Instance { get; } = new SettingsModel();
Изменение зафиксировал.

Добавлено через 5 минут
xr_Sanya, я уже у вас раньше спрашивал, вы не ответили.
Чем идентифицируется монитор? Значениями каких свойств?
Вот есть два экземпляра MonitorConfiguration.
Как понять, что они отражают один и тот же монитор или два разных?

Добавлено через 2 минуты
Цитата Сообщение от xr_Sanya Посмотреть сообщение
У модели должно быть отражение Monitors из SettingsService?
Я вот смотрю сейчас на ваш класс SettingsService и вообще не пойму: А нафиг он нужен?
Он же ничего не делает.
В сервисы объединяю члены для разгрузки кода каких-то объектов.
В данном случае для разгрузки Модели.
Но в этом сервисе ничего нет.
Он ничего не разгружает, только геморрои создаёт со своим использованием.
Зачем вы его создавали?
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
04.11.2021, 20:35  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Как понять, что одни отражают один монитор или два разных?
Индексы в таблице я раньше использовал, тоесть Listbox.SelectedIndex биндился к полю SelectedIndex во ViewModel и по этому получал данные о мониторе. Но так я биндился неправильно, то в данной реализации поиск монитора нужно использовать по полю Name или вместо List в SettingsService использовать словарь.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
04.11.2021, 20:39
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Индексы в таблице я раньше использовал, тоесть Listbox.SelectedIndex
Это ОЧЕНЬ неправильно.
Мониторы - это ФИЗИЧЕСКИЕ устройства.
А тип MonitorConfiguration является отражением этого монитора.
А вы его идентифицируете каким-то непонятным списком который никак не связан с ФИЗИЧЕСКИМИ мониторами.
Полная пурга.
Нужен какой-то уникальный ключ, который жёстко связан с железом монитора.
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
04.11.2021, 20:40  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Зачем вы его создавали?
Чтобы отразить структуру своего основного проекта. В нем этот сервис занимается сериализацией и десериализацией данных, а также хранит их в виде синглтона сделанного с помощью IoC. Является по сути единым местом где хранятся все настройки приложения.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
04.11.2021, 20:41
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Является по сути единым местом где хранятся все настройки приложения.
А причём здесь Мониторы?
Мониторы это физические устройства.
Как с ними связан этот сервис?
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
04.11.2021, 20:43  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
который жёстко связан с железом монитора
Такой есть, называется EDIDProductCode, он уникален для каждого монитора. SettingsService из моего основного проекта

Добавлено через 47 секунд
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А причём здесь Мониторы?
Он загружает настройки мониторов которые пожелал сохранить пользователь, может это и не правильно.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
04.11.2021, 20:48
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Такой есть, называется EDIDProductCode, он уникален для каждого монитора. SettingsService из моего основного проекта
Тогда для EDIDProductCode надо добавить свойство в MonitorConfiguration.

Цитата Сообщение от xr_Sanya Посмотреть сообщение
Он загружает настройки мониторов которые пожелал сохранить пользователь, может это и не правильно.
Если нужно их сохранять - то пусть.
А что в проекте работает с ФИЗИЧЕСКИМИ мониторами?
Или в этом проекте вас этт момент не интересует, и вы не задавали соответсвующий сервис (или что-то иное)?

Добавлено через 1 минуту
Есть ли у вас какой-то объект который следит за физическими мониторами и уведомляет об изменении их характеристик?
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
04.11.2021, 20:58  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А что в проекте работает с ФИЗИЧЕСКИМИ мониторами?
Или в этом проекте вас этт момент не интересует, и вы не задавали соответсвующий сервис (или что-то иное)?
Ничего, в нем используются устройства отображения, а не мониторы. Устройства отображения имеют только системное имя.
Но чтобы различать эти источники отображения (например после перезагрузки системы или замены мониторов местами) я привязал их к системной информации мониторов.

Приложение регулирует GCID(параметры цветов) источника отображения (не монитора), но вся проблема в том что если не связывать источник отображения с монитором, то хранить информацию о настройках источника отображения не получится и если вдруг поменяет система мониторы местами или сделает это пользователь, то настройки таких мониторов будут некорректные, так как источники отображения тоже поменяются, но в произвольно порядке. Поэтому идентифицировать источник отображения по его имени нельзя. Для решения этой проблемы я использую библиотеку которая позволяет получать данные мониторов, в том числе и имя их источника отображения.

Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Есть ли у вас какой-то объект который следит за физическими мониторами и уведомляет об изменении их характеристик?
Нет, сами мониторы не требуются, от них важно получить только изначальные характеристики и то как они зарегистрированы в системе. Потом программа полностью работает только с источником отображения монитора.

Тоесть монитор как таковой нужен только чтобы идентифицировать источник отображения привязанный к нему. И для хранения настроек, чтобы привязываться к уникальному идентификатору монитора.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
04.11.2021, 21:10
xr_Sanya, то есть всё что вам нужно - это следить за списком List<MonitorConfiguration> _monitors?
Там находятся виртуальные объекта, но большего и не нужно?

Если нужно следить за этим списком, то нужны события извещающие об его изменении.
Это же у вас отдельный сервис.
И следовательно предполагается, что у него может быть несколько потребителей которые независимо могут изменять данные.

Я бы лучше его инкапсулировал в Модели, чтобы кроме Модели никто не мог на него влиять.
А модель уже будет "разрулировать" между несколькими потребителями.
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
04.11.2021, 21:16  [ТС]
Вот немного расписал что конкретно хранит в таблица с мониторами
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// тут перебираются все подключённые мониторы
  foreach (var display in PathDisplayTarget.GetDisplayTargets())
            {
                var displayDevice = display.ToDisplayDevice();
                var displayPreferredSettings = displayDevice.GetPreferredSetting();
 
//Тут мы получаем уникалный идентификатор монитора
                var displayCode = display.EDIDProductCode;
 
//Имя которое видит пользваотель
                var displayFriendlyName = display.FriendlyName;
 
//Имя источника отображения
                var displayName = displayDevice.DisplayName;
 
//Ширины и высота монитора
                var displayHeight = displayPreferredSettings.Resolution.Height;
                var displayWidth = displayPreferredSettings.Resolution.Width;
 
// Заполняем таблицу мониторов полученными данными
                Screens.Add(new ScreenEntity
                {
 
// Имя которое видит пользователь
                    Name = INIManager.GetValue($"{displayCode}", "Name", $"{displayFriendlyName}"),
 
//Имя источника отображения
                    SysName = INIManager.GetValue($"{displayCode}", "SysName", $"{displayName}"),
 
//Конфигурация цветов для дневного периода
                    DayColorConfiguration = new ColorConfiguration
                    (
                        colorTemperature: INIManager.GetValue($"{displayCode}", "DayColorTemperature", 6600),
                        brightness: INIManager.GetValue($"{displayCode}", "DayBrightness", 1.0)
                    ),
 
// Конфигурация цветов для ночного периода
                    NightColorConfiguration = new ColorConfiguration
                    (
                        colorTemperature: INIManager.GetValue($"{displayCode}", "NightColorTemperature", 5500),
                        brightness: INIManager.GetValue($"{displayCode}", "NightBrightness", 0.8)
                    ),
 
// Текущая конфигурация цветов
                    CurrentColorConfiguration = new ColorConfiguration
                    (
                        colorTemperature: INIManager.GetValue($"{displayCode}", "DayColorTemperature", 6600),
                        brightness: INIManager.GetValue($"{displayCode}", "DayBrightness", 1.0)
                    ),
 
//Время начала ночного периода
                    NightStartTime = new StartTime
                    (
                        hour: INIManager.GetValue($"{displayCode}", "NightStartHour", 23),
                        minute: INIManager.GetValue($"{displayCode}", "NightStartMin", 0)
                    ),
 
 
//Время начала дневного периода
                    DayStartTime = new StartTime
                    (
                        hour: INIManager.GetValue($"{displayCode}", "DayStartHour", 7),
                        minute: INIManager.GetValue($"{displayCode}", "DayStartMin", 0)
                    ),
 
//Недоделанная фича, создание контекста источника отображения из WinApi
                    DeviceContext = Native.CreateDC(displayName, null, null, 0),
 
//Собственно возможность отключить взаимодействие программы с монитором
                    IsActive = INIManager.GetValue($"{displayCode}", "Active", true),
 
//Ширина и высота
                    Height = displayHeight,
                    Width = displayWidth,
 
//EDID ProductCode, уникальный идентификатор монитора
                    DisplayCode = displayCode,
                });
            }
Добавлено через 4 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
то есть всё что вам нужно - это следить за списком
Следить,менять его из разных мест приложения, при этом отображать изменения на View.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
04.11.2021, 21:20
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Следить, менять его из разных мест приложения, при этом отображать изменения на View.
В таком случае, это у вас не сервис, а почти полноценная Модель.
В ней же есть Бизнес Сущности и, соответственно, есть Бизнес Логика.

Добавлено через 1 минуту
Тогда интерфейс нужно реализовать в этом Сервисе.
А лучше переименовать его в Модель, раз по функционалу он и есть Модель.

Добавлено через 44 секунды
До полнеценной Модели там не хватет только событий уведомляющих об изменениях.
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
04.11.2021, 21:49  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Там находятся виртуальные объекта
Да, там находится смесь из источника отображения,его параметров и привязанного монитора
Я собирался разделить эти данные, но не успел, так как хочу сперва разобраться с архитектурой приложения.

Добавлено через 4 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
До полнеценной Модели там не хватет только событий уведомляющих об изменениях.
Список Screens представлял из себя ObservableCollection, в котором были сущности реализующие INPC, при изменении сущности вызывался OnPropertyChanged и привязанная к этой коллекции View обновляла на экране данные.

Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Тогда для EDIDProductCode надо добавить свойство в MonitorConfiguration.
Для тестового решения я просто хотел искать его по имени.

Добавлено через 17 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
по функционалу он и есть Модель.
Так и есть, я разделял их только потому что сервисы могли общаться между собой либо использовали циклы. В модель я выносил только методы для работы с данными сервисов.

Добавлено через 5 минут
в приложении SettingsService и ScreenModel связаны между собой.
SettingsService занимается заполнением данных, а ScreenModel предоставляет для ViewModel методы, которые работают с сущностями таблицы SettingsService.Screens, для того чтобы корректно заносить данные из пользовательского ввода в эту таблицу. Другим сервисам для корректного занесения данных не требуется ScreenModel, они заносят данные напрямую в SettingsService.Screens
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
04.11.2021, 23:10
xr_Sanya, Чё-то как-то очень запутано.

Должно быть место где находятся ваши Бизнес Сущности.
Должны быть методы для обращения к ним.
Если членов очень много, и они как-то подаются функциональной группировке и отделению от места хранения Бизнес Сущностей, то можно создать Сервис.
Типичный пример Маппер.
Он ничего не хранит и в нём только статические методы отражающие одни типы на другие.

А у вас размазались по многим типам сами Бизнес Сущности и непосредственно их функционал.

Добавлено через 5 минут
Сейчас переделать архитектуру вашего приложения будет сложно.
Поэтому для понимания, давайте займёмся тестовым проектом.
Ту модель что мы делали - это реализация Бизнес Логики и в первую очередь хранилище Бизнес Сущностей (их пока ещё нет).
Вам нужно в этот класс перенести весь сервис SettingsModel.
Так же нужно добавить internal классы для Бизнес Сущностей Мониторов.
Именно в них будет храниться информация.
И, конечно, нужно какое-то свойство-ключ.
Без этого будет невозможно подерживать связб между Бизнес Сущностями и их отражением.
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
04.11.2021, 23:17  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Должно быть место где находятся ваши Бизнес Сущности.
Место хранения сущностей в моем проекте : бизнес сущности

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Должны быть методы для обращения к ним.
Методов для обращения к ним нет, сущности представляют из классы полями, некоторые сущности через конструктор заполняют поля. Некоторые реализуют INPC для работы с View(как я понял это неправильно).

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если членов очень много, и они как-то подаются функциональной группировке и отделению от места хранения Бизнес Сущностей, то можно создать Сервис.
Не совсем понимаю про что речь, сущностей самих по себе не много, хранятся они как правило в таблицах.

Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Сейчас переделать архитектуру вашего приложения будет сложно.
Для этого я и решил сделать тестовый проект, как разберусь в нем с архитектурой, то возьмусь переписать основной уже с новыми знаниями.

Добавлено через 3 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
сервис SettingsModel
Нужно единое место хранения настроек, проблема в том что для другой View нужно будет создать еще один экземпляр класса модели. Из за этого не получится сделать единый класс настроек. Как вариант можно использовать IoC, синглтон и т.п.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
04.11.2021, 23:27
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Место хранения сущностей в моем проекте : бизнес сущности
Это классы (возможно) для Бизнес Сущностей, а не место где хранятся их экземпляры (то есть сами Бизнес Сущности).

Цитата Сообщение от xr_Sanya Посмотреть сообщение
Из за этого не получится сделать единый класс настроек.
И не надо. Сейчас сначала давайте сделаем одну модель.
Потом к ней добавим другую.

Но вам надо как-то выделить собственно то что является вашими Бизнес Объектами.
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
04.11.2021, 23:56  [ТС]
Добавил что написано в репозиторий

Цитата Сообщение от Элд Хасп Посмотреть сообщение
И, конечно, нужно какое-то свойство-ключ
Поле Name из MonitorConfiguration
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
06.11.2021, 20:00
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Добавил что написано в репозиторий
Синхронизацию сделали?
На Гите последняя фиксация от 02.11.2021.

Добавлено через 2 минуты
xr_Sanya, ох, блин!
Я не тот Реп смотрел - запутался.

Добавлено через 12 минут
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Поле Name из MonitorConfiguration
Раз это идентификатор Бизнес Сущности, то он должен быть неизменяемым (только для чтения).
Я сделал изменения и зафиксировал:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
namespace Common.Entities
{
    public class MonitorConfigurationDomainEntity
    {
        public string Name { get; }
        public int Height { get; set; }
        public int Width { get; set; }
        public bool IsActive { get; set; }
        public double ColorConfiguration { get; set; }
 
        public MonitorConfigurationDomainEntity(string name)
        {
            Name = name;
        }
 
        private static int countDemo;
        public MonitorConfigurationDomainEntity()
            : this($"Demo #{++countDemo}")
        { }
    }
}
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
06.11.2021, 20:32  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я сделал изменения и зафиксировал:
Я так понял нужно теперь связать ViewModel и Model, чтобы изменения отображались на View
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
06.11.2021, 21:11
xr_Sanya, сделал Фиксацию 47ad01e5:
Добавлены: DTO для создания слепка Монитора.; Специальная коллекция для Мониторов; Маппер в Модели; пример реализации интерфейса в Модели.
Посмотрите.
Но изменения не полные.
Просто показал пример в каком направлении надо идти.
Будут вопросы - пишите.

Добавлено через 1 минуту
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Я так понял нужно теперь связать ViewModel и Model, чтобы изменения отображались на View
Надо доделать Модель сначала.
Я не совсем понимаю как у вас Сервис связан с Бизнес Сущностями, поэтому в своём примере сервис не использовал.
Но вы добавьте его туда где это нужно.

Добавлено через 1 минуту
Бизнес Сущности должны быть полностью инкапсулированы в слое Модели.
Из него будут выходить только их слепки.

Добавлено через 1 минуту
P.S. xr_Sanya, и на будущее.
Если я долго ничего не отвечаю - не стесняйтесь напомнить.
Просто за своими делами могу забыть о вашей теме.
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
07.11.2021, 05:51  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Просто показал пример в каком направлении надо идти.
Интересно выглядит, нигде не видел похожей реализации модели.
Как я понимаю:
MonitorDomainCollection - словарь со своими методами, тоесть место хранения всех сущностей и адаптирвоанные к ним методы из IDictonary.
MonitorConfigurationDto - дата трансфер, для того чтобы менять данные в словаре либо их получать.
MonitorConfigurationDomainEntity - бизнес сущность, но я не совсем понимаю для чего она используется когда есть DTO, я понимаю что DTO это класс который содержит в себе только данные для передачи куда либо, но сущность тоже вроде как не имеет данных.
Метод маппера CopyTo тоже не совсем понятен.

Тоесть чтобы подготовить модель к работе нужно создать экземпляр класса MonitorModel и вызвать в ней метод Create для нужных сущностей, тем самым мы получим готовую модель.
Получить данные можно с помощью MonitorModel.GetMonitors(), это должно вернуть копию MonitorDomainCollection.
Менять данные модели мы можем только ее методами.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я не совсем понимаю как у вас Сервис связан с Бизнес Сущностями
Если вы про SettingsService, то я его объекденил с моделью же в последних коммитах.
Сервис должен хранить настройки всего приложения как единая точка к которой можно обратится и получить/поменять нужный параметр, не знаю насколько это хорошая идея, но как по мне она упрощает структуру. В моем приложении сервис создавал место хранения бизнес сущностей (List) и собственно заносил их туда чтобы к ним был доступ из всего приложения.

Вообще конечно тяжелая для понимания логика работы с моделью)
Как же те примеры со студентами в которых один класс c INPC

Добавлено через 3 часа 19 минут
Посмотрел плейлист, немного разобрался с моделью и DTO
Плейлист
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.11.2021, 05:51

MVVM биндинг view в model
Я новичок, пытаюсь написать приложение UWP согласно паттерну MVVM В общем, в модели должен быть список экземпляров класса. В классе...

Бизнес-логика
Подскажите, как решить следующую проблему: Занимаюсь по пособию, и возникла ошибка. Код из C# public class DataCommands { ...

WPF MVVM - Transfer Data to Model
Всем привет, уважаемые. Есть два этапа: 1. Переношу коллекцию ObservableCollection из VM в Model. 2. А затем из Model в другую VM. ...

Каково назначение папки Model в MVVM
Просто я к тому, что все классы относящиеся к логике будут иметь пространство имён начинающееся с Model, это нормально вообще? Или не всю...

MVVM. Получение данных объекта по сети - в model или во viewmodel?
Здравствуйте! Вникаю в паттерн mvvm, прочитал\посмотрел кучу учебных материалов, и если честно, в голове каша уже. Мне понравился своей...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru