3 / 3 / 1
Регистрация: 18.02.2021
Сообщений: 70
|
|||||||||||
1 | |||||||||||
Как смаппить сущность, имеющую внутри себя вложенный объект?13.07.2021, 14:12. Показов 12292. Ответов 41
Всем привет. Подскажите, пожалуйста, как настроить automapper для маппинга ToDoItem в ToDoModel
ToDo:
0
|
13.07.2021, 14:12 | |
Ответы с готовыми решениями:
41
Смаппить сущность в Dictionary используя AutoMapper Прочитать вложенный объект внутри Json API. Как десериализовать вложенный объект? Как разобрать вложенный объект в цикле |
12563 / 8730 / 1311
Регистрация: 21.01.2016
Сообщений: 32,759
|
|
30.08.2021, 07:33 | 21 |
Кретинизм - это слепо верить гугл трендсам. У меня есть реальный опыт использования автомапера. Этим опытом я и поделился. Но да, десятки тысяч новичков, что взяли автомапер моды ради, тут правее человека пять лет с автомапером проработавшего)
Добавлено через 1 минуту А кто тут неадекватно себя повёл? Был диалог, где люди обсуждали автомапер. Ваша проблема из разряда X-Y. Вы, почему-то, решили, что вам нужен автомапер. Я попытался донести, что автомапер вам вообще не нужен. Соответственно, нет той проблемы, о которой вы тут спросили.
0
|
198 / 93 / 43
Регистрация: 09.11.2019
Сообщений: 414
|
|
30.08.2021, 20:43 | 22 |
0
|
12563 / 8730 / 1311
Регистрация: 21.01.2016
Сообщений: 32,759
|
|
31.08.2021, 10:46 | 23 |
__Corey, ну не знаю) Вроде бы все себя вели культурно и обсуждение шло более-менее конструктивно)
0
|
3 / 3 / 1
Регистрация: 18.02.2021
Сообщений: 70
|
|
04.09.2021, 14:54 [ТС] | 24 |
Usaga, вы уже вмешались в существующее обсуждение и не провоцировали его возникновение, так что мой наезд был большей частью необоснованный, за что я извиняюсь. А вот nikolas2008 реально полез не туда. Это просто флуд, о котором я не просил. Если с маппером будут проблемы, я сам до них дойду и,соответственно, буду принимать меры. Пока я встречаю его везде: и в книгах, и на бесплатной стажировке, и на работе. То есть знать, как с ним обращаться мне надо, это просто необходимо.
0
|
1150 / 858 / 263
Регистрация: 30.04.2009
Сообщений: 3,598
|
|
04.09.2021, 15:10 | 25 |
JustAnAnimal, если хотите учится на своих ошибках, а тем более игнорировать конструктивную критику ваше право. Не буду больше вам мешать наступать на грабли, извините.
0
|
12563 / 8730 / 1311
Регистрация: 21.01.2016
Сообщений: 32,759
|
|
05.09.2021, 07:59 | 26 |
JustAnAnimal, я тоже его везде встречаю. Как и Entity Framework. Но это мода, как джинсы подвёрнутые, а не полезная на практике вещь.
Касательно вопроса. Вы можете руками описать мапинг в автомапере, простой лямбдой или вызовом внешнего статического хелпера. Так вы и процесс проецирования в своих руках сохраните, на чём я настаиваю, и "необходимость" использования автомапера не нарушите. И коллегам вам объективно предъявить будет нечего. Мы таким путём пошли на работе прежде, чем дошло, что автомапер нам в этом процессе и не нужен, получается.
0
|
05.09.2021, 15:50 | 27 |
О! я вспомнил одну из причин хорошести Автомаппера - при обновлении структуры модели не нужно париться за обновление "ручных" мапперов (вдруг их больше одного).
На всякий случай объясню примером - мы добавили новые свойства. Это значит надо найти все мапперы которые используют это свойство. А если этого не сделать то например в ДТО модели будет нулл или пустая коллекция. "Ой", же, разве нет? Как вы такую ситуацию решаете? Разумеется пример применим для энтерпрайз приложений много данных. Если скажете - "Ну ищем все использования и обновляем", то сразу вопрос - какой шанс не заметить то что делается не так очевидно, например через генерики, рефлексии и т.п. ? Автомаппер то и решает проблему "ленивых". Он действительно сделает за вас. И в том и другом есть неудобные моменты поддержки.
1
|
22.12.2021, 16:49 | 28 |
Случайно наткнулся на статью и сразу вспомнил эту тему. Не смог не рассказать.
Automapper vs Explicit Conversion И больше всего меня поразили именно тесты. Результаты немного шокировали, даже не верится. Так ли это? А почему я вообще на такую страницу наткнулся? А потому что узнал ещё один вариант "маппинга" - через implicit/explicit. И мне стало интересно, что умные люди говорят. Теоритически это должно быть точной копией обычного самописанного трансформера. Но вот разница в месте размещения и инициализации разная. "Вдруг есть есть ньюансы", - подумал я и пошёл гуглить. А нашёл статью. Заодно вопрос - кто-то делает "маппинг" через приведение типов?
0
|
12563 / 8730 / 1311
Регистрация: 21.01.2016
Сообщений: 32,759
|
|
23.12.2021, 07:00 | 29 |
Элементарно решаем. Тестируем. Т.е. ещё до QA, врамках простой проверки фичи. Очень сложно не заметить, что новое поле\свойство не появляется там, где должно. В моей практике это работает. И работает совершенно хорошо.
Я несколько раз делал, но потом перестал. Вроде писанины меньше (в месте "мапирования"), но это настолько неявно получается, что прямо атас. С автомапером хотя бы видно, что тут идёт проецирование. А с приведением неявным даже этого не видно. Так точно делать не стоит.
2
|
Модератор
|
|
23.12.2021, 15:02 | 30 |
Для implicit увеличение вероятности багов из-за ошибок при присвоении переменным.
Можно неочевидно создать клоны и при этом не осознавать, что это разные экземпляры. Для explicit - он просто не даёт никаких преимуществ в сравнении с методом. Но как-то понятнее, привычнее использовать для создания других экземпляров метод, а (тип) использовать для присвоения ссылки на объект разным типам переменным, без клонирования самого объекта.Моих знаний тоже не хватает для понимания такого результата. Что бросилось в глаза это создание новых строк и парсинг в Explicit Conversion. Надо загрузить исходники теста с Гита, посмотреть их и повторить тест. Если будет на это время когда-нибудь...
0
|
23.12.2021, 16:00 | 31 |
Я тоже сначала решил проект глянуть, а оказалось что это вообще другой проект. А эти тесты "использовались при создании этого проекта". Я понял так. То есть взять и потестить не получится. Нужно взять и написать аналогичные тесы по примеру.
Разница есть. Это ещё большая "прозрачность" при конверсии. Но вот преимущество это или нет - это как раз скорее относится к личным предпочтениям. Боюсь раздуть философскую дискуссию. Но разве нововведния в новых версиях C# всё больше и больше не "засахаривают" разработку? Не уменьшают количество написанного кода? Не делают логику исполнения более "прозрачной" для программиста. Я бы сравнил explicit конверсию с нововведнием - создание объекта без указания типа. Ну знаете ли, тоже настолько неочевидное и прозрачное действие, что без IDE (просмотр файла в Git например) вы сразу то и не поймёте что там будет за итог. Я против повсеместных "var", а сейчас ещё и типизацию убрали. Что мы получили: " var variable = new(item); ". Ну зашибись, облегчили работу жёсткого диска в ущерб очевидности и пониманию.Я к чему. Если целью является написание кода который выполняет задачу, то explicit очень неплохо вписывается сюда. При продуманной архитектуре, тестах и т.п. он даёт тот же эффект, но меньшее количество кода в местах трансформации. Разве нет? А вообще, я против неочевидностей, сахарозы и уменьшению кода.
0
|
Модератор
|
||||||||||||||||
23.12.2021, 16:50 | 32 | |||||||||||||||
Я вот думаю всё разделить данную тему, так как уже ушли от первоначального вопроса.
Но посты (вопросы и ответы) очень запутаны. Здесь дело не в сахаре. А в том что от оператора явного приведения ожидаешь иного поведения. Пример, типового ожидаемого поведения:
И получаем весьма неочевидное:
Такое поведение является нормой для значимых типов, но для ссылочных, на мой взгляд, это может привести к путанице и трудноуловимым багам.
0
|
12563 / 8730 / 1311
Регистрация: 21.01.2016
Сообщений: 32,759
|
|
23.12.2021, 16:51 | 33 |
Более того: это решение засирает код класса ненужной для него обязанностью. Ещё более того: не любой мапинг так вообще возможно сделать. Может потребоваться обращение к внешним statefull-сервисам. Или разные сценарии мапинга между двумя сущностями.
Эм. Нет. Тут не "прозрачность", тут - неочевидность. Уменьшают, но не делают её волшебной и неочевидной. Почему? Такой код не соберётся. Тип вывести неоткуда. С одной стороны речь о том, что это хорошо вписывается в код. С другой - о продуманной архитектуре, которая однозначно против размещения кода проекцирования в сущностях. Это противоречивые тезисы. Опять же, "сахар" и "уменьшение кода" не значит вред для очевидности.
0
|
12563 / 8730 / 1311
Регистрация: 21.01.2016
Сообщений: 32,759
|
|
23.12.2021, 17:39 | 35 |
Элд Хасп, какой-то хреновый тест. Вы видели, ЧТО там сравнивается?) Основной посыл: Automapper не то, что не хуже, он даже немного быстрее. Но там автор упустил один момент, который и сказался на разнице в производительности. Угадаете, какой?)
Добавлено через 6 минут Вообще, можно сходу уже предположить, что происходит что-то не то в тесте, ибо автомапер один чёрт генерирует код, который равен тому, что написан руками. Т.е. должен быть максимум паритет, за вычетом первоначального штрафа на генерацию. Но уж никак не преимущество.
0
|
23.12.2021, 17:44 | 36 | |||||
Конечно есть откуда. Вы в IDE то весь код можете посмотреть или мышкой навести на "item". Да, согласен, поторопился я с примером. Накидал быстрый пример о чём я хотел сказать.
Добавлено через 2 минуты Именно это меня и сильно удивило и заинтересовало. Но скорее я поверю в то что или "есть ньюанс", или тестировалось неверно. О каком моменте вы намекали?
0
|
12563 / 8730 / 1311
Регистрация: 21.01.2016
Сообщений: 32,759
|
|
23.12.2021, 17:45 | 37 |
HF, мой докапон был именно к вашему фрагменту кода) Понятно, что вы там ошиблись)
Но смотрите какое дело: я последние лет пять или шесть постоянно использую var и для меня (и моих коллег, которые ревьювят мой код) это не вызывает когнитивной нагрузки. Т.е. сидя в TortoiseHG не возникает необходимости запустить IDE и посмотреть какой же там реально тип. И просто при просмотре кода в IDE тоже.Т.е. проблема явно надуманная. В большинстве случаев, вам и не интересно знать какой там тип откуда прилетел и куда полетел.
0
|
Модератор
|
|
23.12.2021, 17:45 | 38 |
Ну, я сразу написал:
AutoMapper не использую.
Поэтому возможно упускаю ещё что-то. На уровне моих знаний, он работает через рефлексию и ни при каких условиях в равных задачах не может быстрее.
0
|
12563 / 8730 / 1311
Регистрация: 21.01.2016
Сообщений: 32,759
|
|
23.12.2021, 17:49 | 39 |
Посмотрите на ручной маппинг и подумайте, как Automapper заполняет свойство
FullName . Отвечу: никак. Он не знает как и пропускает (оно не подпадает под соглашение). Поэтому профиль автомапера и быстрее. Если после конфигурирования автомапера вызвать AssertConfigurationIsValid(); , то вы получите исключение, где автомапер скажет, что не знает как смапить это свойство.Добавлено через 1 минуту Вы ничего не упускаете. Автомапер использует рефлексию, но только при первом мапинге. Когда ему нужно сгенерировать мапперы. После этого производительность строго та же, что у вручную написанного кода. Плюс-минус. Проблемы автомапера не в производительности мапинга.
0
|
Модератор
|
|
23.12.2021, 17:51 | 40 |
Я это и имел ввиду.
И мне ещё не нравится преобразование в строку и обратно для свойства Id. Как-то уж очень подозрительно выглядит. Поэтому и хотел посмотреть исходники (которых как оказалось нет).
0
|
23.12.2021, 17:51 | |
23.12.2021, 17:51 | |
Помогаю со студенческими работами здесь
40
Как работать с массивом в котором есть объект и вложенный массив? Как записать вложенный оператор If внутри другого оператора If, чтобы добиться нужного эффекта? Терминология: Класс, объект, экземпляр, сущность. (Дейт о путанице в этой сфере) Как настроить форму обратной связи под себя? (файлы внутри) Как поведет себя Timer, если код внутри него, не успел выполниться? Вложенный объект Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи | |||||
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
|
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален
В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
|
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
|
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели
В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
|
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества
Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
|
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов.
. . .
|
С чего начать программировать микроконтроллеры
raxper 06.01.2025
Введение в мир микроконтроллеров
Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
|
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
|
Обновление сайта www.historian.by
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
|
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
|
Модель полного двоичного сумматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list):
s=^y]
p=x and y
for i in range(1,len(x)):
s. append((x^y)^p)
p=(x and y)or(p and (x or y))
return s
x=list()
y=list()
|
Это мы не проходили, это нам не задавали...(асихронный счётчик с управляющим сигналом зад
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
|