|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
|||||||||||||||||||||
UWP Разбор MVVM подхода с использованием API и Json04.02.2022, 21:07. Показов 9427. Ответов 126
Доброго времени суток,
Как уже писал, перехожу на подход MVVM и сталкиваюсь с проблемами, шерстил форум, но не нашел подходящие решение для моего случая. Очень буду благодарен за помощь. Логика следующая, пользователей вводит номер телефона, по апи идет запрос и я получаю ответ в виде JSON, и если JSON приходит в response, то панель с смс должна появится. Если номер не правильный то приходит в error значение. Проблема вот в чем. Как мне вернуть данные из Model в ViewModel, не используя статический класс или свойство ? Да в принципе, как правильно управлять данными которые пришли в model и передать их в Viewmodel на примере JSON. View:
Так же я понимаю, что возможно здесь ошибки подхода MVVM, любые поправки с теплотой приму
0
|
|||||||||||||||||||||
| 04.02.2022, 21:07 | |
|
Ответы с готовыми решениями:
126
Создание программ с использованием структурного подхода Напишите программу (с использованием ООП подхода) |
|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
|||||||
| 06.02.2022, 12:23 [ТС] | |||||||
0
|
|||||||
|
Модератор
|
||
| 06.02.2022, 13:00 | ||
|
В результате вы должны получить абстрактную Модель, которая получает какие-то данные в параметрах метода и возвращает результат. А как она это делает: обращается в Web, в локальную БД, каким-то образом вычисляет и т.п. - никто кроме самой Модели знать не должен. Все параметры необходимые для работы её методов, если параметров самого метода не хватает (адрес сервера, строка соединяя и т.п.), в Модель должен передавать App. Это можно делать непосредственно в App. Тогда там будет создаваться экземпляр Модели и внедряться в VM. Но App может внедрить это и в VM, а VM уже сама внедрит эти параметры в Модель при создании экземпляра.
1
|
||
|
Модератор
|
||
| 06.02.2022, 17:48 | ||
|
Собирать ответ в строку, а потом десериализовать стало накладно - появлялась целая куча мусора и используемая память быстро росла. А когда вызывался мусорщик, появлялись лаги. А лаг потенциально это пропущенная сделка и удар по кошельку клиента. Поэтому я там сериализовывал входящий поток сразу в объект, без промежуточного создания строки. Нагрузка на память резко уменьшилась. А лаги совершенно пропали.
0
|
||
|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
|||||||||
| 06.02.2022, 19:52 [ТС] | |||||||||
0
|
|||||||||
|
Модератор
|
|||||||||
| 06.02.2022, 20:24 | |||||||||
|
Добавлено через 1 минуту Добавлено через 5 минут Там я делал какой-то хитрый парсинг с чтением заголовка потока. Но в вашем случае, думаю можно поступить проще. Создайте Connect с дженериком:
0
|
|||||||||
|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
|||||||
| 08.02.2022, 19:35 [ТС] | |||||||
|
Элд Хасп, В итоге у меня получилось так:
В ViewModel у меня получается идет и дессериализация и все проверки и вывод окна если нету интернета ? Это правильно, что все это будет находится именно там ? а View служит исключительно отображением и кое какими свойствами. Например переключение видимости панель.
0
|
|||||||
|
Модератор
|
|
| 08.02.2022, 19:48 | |
|
Ihave, вы же хотите сделать правильный MVVM - тему же с этого начали.
Если так то Модель должна полностью инкапсулировать "настоящие" Данные. А у вас метод Connect возвращает HttpWebResponse. А если завтра эта модель будет работать с БД, или с локальным набором файлов XAML, то как она вернёт HttpWebResponse? Вам придётся изменять возвращаемый метод. А так как этот метод публичный, то это может привести к изменению во всех слоях приложения. То есть у вас совершенно нет никакой абстракции данных, а это нарушение не то, что MVVM, а общих принципов, правил ООП, SOLID.
0
|
|
|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
||||
| 08.02.2022, 20:12 [ТС] | ||||
0
|
||||
|
Модератор
|
||||
| 08.02.2022, 23:35 | ||||
|
Так вот инкапсуляция данных это важный принцип не то, что MVVM, а даже с точки зрения ООП. Если бы вопрос был "А бы как, но лишь бы работало" - тогда другое дело. И даже более, за связь с Хранилищем (без разницы это БД или WEB сервер) обычно отвечает специально выделенный слой в Модели - Репозиторий. Чаще всего его используют с БД, но концептуально он применяется для любого типа источника данных. Ссылка на SignM у кого будет? Если только у другой Модели и App - то такая реализация допустима. Если же о SignM будут знать View или ViewModel. То есть по сути, по своей функциональности SignM - это Репозиторий. И относится надо к нему соответственно. Мы же об этом уже писали. И я думал вы так и сделали: на каждый тип запроса свой метод возвращающий свой тип данных. А ту обратно, как чёрт из табакерки, выскакивает публичный HttpWebResponse Connect(byte[] data).Ihave, у меня предложение. Чтобы меньше заниматься догадками залейте проект на Гит. Там можно будет посмотреть на все нюансы взаимодействия не задавая лишних вопросов.
0
|
||||
|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
|||
| 09.02.2022, 23:18 [ТС] | |||
|
Элд Хасп,
![]() Как я уже говорил задача сложней чем я описывал вначале. Если вы готовы помочь давайте рассмотрим "рабочий режим" в рамках обычного входа и больше ничего. Как сейчас работает: 1)Пользователь открывает программу и видит только текстовое поле с вводом телефона и кнопкой. Вводит номер телефона и нажимает кнопку. По нажатию кнопки идет считывание номера и собирается JSON в VM вместе с некоторыми данными об устройстве. 2) VM обращается к определённой модели у нас это Authorizat, модель Authorizat дополняет URL адреса соответствующий авторизации на сервере и передает массив байтов на отправку на сервер в другую модель Connect. 3) Модель Connect отправляет данные на сервер и получает ответ a) Eсли нету интернета, возвращает Null сначала в Authorizat потом в VM, происходит повторение вызова Authorizat каждые 5 секунд три раза, в итоге если интернета нету, пользователь должен получить диалоговое окно с тем, что интернета нету и либо он нажмет повторить, снова будет три раза по 5 секунд вызов Авторизация, либо отменит всю операцию. b) Если все хорошо, Connect возвращает джсон в виде String в Authorizat и сохраняет статус кодов http. 4) Authorizat получила джсон и возвращает его в VM 5) VM получает JSON и дессерелизирует его в класс а затем обрабатывает. a) Если пользователь ввел все верно и телефон совпадает с базой то показывает Infobar который отображает статус http и информацию о том что смс отправлена и тд, так же появляется поле с вводом смс и кнопкой подтверждения кода смс. b) Если что то не так, то выводится в том же infobar ошибка и описание ошибки соответствующей коду и панель не появляется. 6) Пользователь вводит смс и повторяется все с теми же моделями, так как раньше поле SetSms было пусто, то сервер понял, что пользователь не вводил смс, но если поле SetSms заполнено, то сервер уже выдаст Token для дальнейшей авторизации или покажет ошибку. Токен необходимо сохранить, чтобы использовать уже его дальше для авторизации и получение других данных от сервера. Что не получается сделать: 1) Общие правильность написание MVVM, я не уверен, что правильно сделал, так как вы писали, что VM по сути не должно что то делать c данными?! 2) Передача статус состояния HTTP кодов из Connect, не уверен, что правильно так же сделал. 3) Передача данных в модели, такие как доп UrlAPI, хотелось бы избавиться от локального хранилища, но так и не понял как передавать данные из APP в модель. Например UriApi, Device, HWid и тд 4) Так же не уверен в том что я добавил несколько строк кода в код (Например отслеживание нажатия enter) страницы Sign.cs. Так как не знаю как это перенести в VM.
0
|
|||
|
Модератор
|
||||
| 10.02.2022, 01:14 | ||||
|
Сериализовать JSON в объект должна Модель. Но у вас не хватает пока знаний и опыта чтобы это правильно сделать. Начните с того, что построите ПОЛНОСТЬЮ Модель и отдебажите её в КОНСОЛЬНОМ приложении. Когда у вас будет готовая такая Модель, то большая часть вопросов у вас отпадёт сама собой. Добавлено через 25 секунд Добавлено через 2 минуты При построении Модели из неё не должно выходить ни каких "сырых" данных, только различные готовые объекты: типы общего применения, сущности, DTO и т.п. Добавлено через 2 минуты Все JSON, XML, потоки, сокеты, БД и т.д. - это самый нижний слой Модели. Обычно его выполняют в виде Репозитория. Но если вам удобнее, привычнее - можете вместо него сделать какой-то сервис. Но общаться с ним может только Модель и, в крайнем случае, App.
0
|
||||
|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
|||||||||||
| 10.02.2022, 18:43 [ТС] | |||||||||||
|
Нужно чтобы после ввода телефона, пользователю показывалась панель с смс, если нету интернета то диаголовое окно о том что проблема с интернетом, если какая то ошика, то нужно показать какая и в чем заключается или что успешно все прошло. Я стараюсь лишь сделать, так как это обусловлено "Техническим заданием" при помощи тех инструментов, которые знаю. Отсюда и ошибки, поэтому и пишу сюда за помощью, так как нацелен сделать все грамотно и с подходом MVVM. Если вы еще имеете ввиду что и Сереализация должно проходить в Модели, то как передать все заполненые поля в модель. Не думаю что такое будет уместно: ![]()
Хотелось бы получить ответ, как все таки правильно то делать(Круто было бы с Реальным КОДОМ).... А не только то что это не правильно.... Но либо примеры непонятные для меня или они не подходящие.
0
|
|||||||||||
|
Модератор
|
|||||||||||
| 10.02.2022, 20:36 | |||||||||||
|
Вот у вас есть Модель в которой ТОЛЬКо Методы и События. Свойств нет. Модель возвращаете ТОЛЬКО DTO-шки. Теперь каждый вопрос формулируйте так, Какое DTO надо передать Модели и какое DTO она должна вернуть? Какогда ответили на этот вопрос, то создаёте соответсвующий метод в модели и реализуете его. Добавлено через 4 минуты Но проблема в том, что ваше приложение уже разрослось. И что встроить в него "по простому" не получится. Поэтому моё предложение: давайте создадим новое приложение с нуля. Сначала реализуем в нем небольшой начальный функционал для закрепления архитектуры (допустим, возьмём только авторизацию логином и паролем). А потом будем наращивать функционал и смотреть чтобы он не ломал архитектуру. Добавлено через 20 минут Я думал там вы навертели. Но там токо авторизация. В принципе реализовано верно. Там же Connect приватный метод - тогда это нормально. А выше здесь в теме вы показывали, что это публичный метод - а вот это неверно. Добавлено через 16 минут Единственно, мне не нравится что возвращается стринг, а не поток. Но если передача не очень частая, то это не важно. Добавлено через 25 минут
0
|
|||||||||||
|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
||||||||||
| 10.02.2022, 22:45 [ТС] | ||||||||||
![]()
Я обновил проект на гитхабе, только добавил еще один параметр HttpStatusCode, так как это особеное свойство, которое трудно будет преоброзовать во что то конкретное. будет время посмотрите пожалуйста.
0
|
||||||||||
|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
|||||||
| 11.02.2022, 20:29 [ТС] | |||||||
|
типо:
0
|
|||||||
|
Модератор
|
|||||||
| 11.02.2022, 20:55 | |||||||
|
В DTO вы можете использовать не все свойства, но сигнатура метода от этого не изменится. А с кортежем для любого изменения в наборе значений придётся создавать новую перегрузку метода. Так же не всегда однозначно хранение и передача куда-то кортежа. Допустим, в метод приходит какой-то DTO. Можно частично изменить его свойства и передать дальше для обработки. С кортежем придётся для каждого изменения создавать новый экземпляр кортежа, так как это значимый тип. И если его надо вернуть после обработки, то нужно или чтобы его метод возвращал, или параметр ref/out. Но в целом, в реальных приложениях, там где раньше всегда использовался DTO сейчас в 99% проще заменить на кортеж или запись. Есть ещё нюанс с объектами которые хранятся длительное время. Если это DTO - то вы можете ему задать теги XML-документации и в любом месте использования быстро посмотреть справку по нему. С кортежами это невозможно, поэтому описывать их приходится в тегах методов и др.членов их использующих. Что часто очень не удобно. Поэтому их следует делать "говорящими" - то есть имена в них должны быть очень просты в понимании на английском. Добавлено через 10 минут Для десяти параметров - лучше создать частично мутабельный DTO и передать его в методах параметра. Что-то в таком духе:
0
|
|||||||
|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
||
| 11.02.2022, 21:59 [ТС] | ||
|
То что вы показали, это только для чтения, соотвественно я не смогу указать логин и пароль из VM, который ввел пользователь и получается DTO я могу так же в моделе делать?!
0
|
||
|
Модератор
|
||||
| 11.02.2022, 23:00 | ||||
|
Те же дефолтные .Net типы: int, double, string, Point и т.д. - тоже смело можно отнести к DTO. Некую опасность могут нести только ссылочные мутабельные DTO. Поэтому их обычно реализуют как значимые типы: int, double, кортежи. Или как ссылочные иммутабельные: string, PropertyChangedEventArgs. Но частично мутабельные тоже используются: RoutedEventArgs содержит одно мутабельное свойство Handled. Так же изредка имеет смысл использование и полностью мутабельных ссылочных DTO: сущности в EF. Ссылочные DTO сейчас легко строить на основе Записей. Добавлено через 6 минут Только надо не забывать, что Модель - это ОБЪЕКТ и даже почти всегда ЭКЗЕМПЛЯР. Значит возможно какие-то данные передать заранее. Допустим, при создании экземпляра Модели вы передаёте данные достаточные для создания соединения: адрес, порт, протокол и т.д. При авторизации вам достаточно передать уже только логин и пароль, а данные для соединения уже не нужно передавать. Если авторизация успешна, то авторизация фиксируется в Модели (допустим, ключ сеанса). И для последующей передачи запроса, уже не нужно передавать ключ сеанса, достаточно передать только данные для запроса. Добавлено через 1 минуту Я его просто не показал здесь, как само-мобой подразумевающееся и для уменьшения кода в посте.
2
|
||||
|
Модератор
|
||
| 12.02.2022, 11:12 | ||
|
В нём много лишних файлов. Вы, наверное, его создавали не в Студии, а "руками". Поэтому в нём нет файла игнорирования. Исправить не могу - поскольку нет прав. Вам нужно: 1) Не входя в Студию очистить локальный реп от всех лишних файлов и папок. В вашем случае это: .vs, obj;2) Синхронизировать реп, чтобы они удалились на Гите; 3) В корень локального репозитория добавить вот эти два файла из архива: filesForGit.7z; 4) Войти в Студию и синхронизировать из неё. В будущем, советую для работы с Гитом для Решений Студии использовать только саму Студию, включая создание Репа на Гите.
1
|
||
| 12.02.2022, 11:12 | |
|
Разбор JSON, используя Newtonsoft.Json Моделирование работы РЛС с использованием объектно-ориентированного подхода Использованием навигационного подхода без применения SQL запросов Моделирование работы РЛС с использованием объектно-ориентированного подхода Парсинг json ответа api vk. Вложенность Json Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
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: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|