Форум программистов, компьютерный форум, киберфорум
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. Показов 16505. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера 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: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru