С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.97/65: Рейтинг темы: голосов - 65, средняя оценка - 4.97
3 / 3 / 1
Регистрация: 18.02.2021
Сообщений: 70
1

Как смаппить сущность, имеющую внутри себя вложенный объект?

13.07.2021, 14:12. Показов 12292. Ответов 41

Author24 — интернет-сервис помощи студентам
Всем привет. Подскажите, пожалуйста, как настроить automapper для маппинга ToDoItem в ToDoModel

ToDo:

C#
1
2
3
4
5
6
7
8
9
10
public class ToDoItem
    {
        public int Id  { get; set; }
        public string Name  { get; set; }
        public string Content  { get; set; }
        public bool IsCompleted  { get; set; }
        public int Importance  { get; set; } 
        public User Creator { get; set; }
        public string CreatorId { get; set; }
    }
ToDoModel:

C#
1
2
3
4
5
6
7
8
9
10
 public class ToDoModel
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Content { get; set; }
        public bool IsCompleted { get; set; }
        public int Importance { get; set; }
        public UserModel Creator { get; set; }
        public string CreatorId { get; set; }
    }
Как я понимаю, исключение вызывает маппинг вложенных объектов User и UserModel. Как этого избежать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.07.2021, 14:12
Ответы с готовыми решениями:

Смаппить сущность в Dictionary используя AutoMapper
Блин, извините за глупый вопрос, но все же. Подскажите пожалуйста, как сущность смаппить в...

Прочитать вложенный объект внутри Json
При запросе отправляю объект Data: public class Data { public Data() => ...

API. Как десериализовать вложенный объект?
Есть тестовый API JSON http://jsonplaceholder.typicode.com/posts Через Visual Studio...

Как разобрать вложенный объект в цикле
Всем привет! Никак не могу дотянуться до элемента в объекте: var array_x = { 1:...

41
Эксперт .NET
12563 / 8730 / 1311
Регистрация: 21.01.2016
Сообщений: 32,759
30.08.2021, 07:33 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от JustAnAnimal Посмотреть сообщение
то просто кретинизм обсирать сверхпопулярный иструмент(достаточно глянуть гугл трендс) и уверять, что он не нужен.
Кретинизм - это слепо верить гугл трендсам. У меня есть реальный опыт использования автомапера. Этим опытом я и поделился. Но да, десятки тысяч новичков, что взяли автомапер моды ради, тут правее человека пять лет с автомапером проработавшего)

Добавлено через 1 минуту
Цитата Сообщение от JustAnAnimal Посмотреть сообщение
Обычно все ведут себя адекватно.
А кто тут неадекватно себя повёл? Был диалог, где люди обсуждали автомапер. Ваша проблема из разряда X-Y. Вы, почему-то, решили, что вам нужен автомапер. Я попытался донести, что автомапер вам вообще не нужен. Соответственно, нет той проблемы, о которой вы тут спросили.
0
198 / 93 / 43
Регистрация: 09.11.2019
Сообщений: 414
30.08.2021, 20:43 22
Цитата Сообщение от Usaga Посмотреть сообщение
А кто тут неадекватно себя повёл?
А это камень в мой огород, мне кажется
0
Эксперт .NET
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
Эксперт .NET
12563 / 8730 / 1311
Регистрация: 21.01.2016
Сообщений: 32,759
05.09.2021, 07:59 26
JustAnAnimal, я тоже его везде встречаю. Как и Entity Framework. Но это мода, как джинсы подвёрнутые, а не полезная на практике вещь.

Касательно вопроса. Вы можете руками описать мапинг в автомапере, простой лямбдой или вызовом внешнего статического хелпера. Так вы и процесс проецирования в своих руках сохраните, на чём я настаиваю, и "необходимость" использования автомапера не нарушите. И коллегам вам объективно предъявить будет нечего.

Мы таким путём пошли на работе прежде, чем дошло, что автомапер нам в этом процессе и не нужен, получается.
0
HF
1202 / 791 / 188
Регистрация: 09.09.2011
Сообщений: 2,411
Записей в блоге: 2
05.09.2021, 15:50 27
Цитата Сообщение от Usaga Посмотреть сообщение
Мы таким путём пошли на работе прежде, чем дошло, что автомапер нам в этом процессе и не нужен, получается.
О! я вспомнил одну из причин хорошести Автомаппера - при обновлении структуры модели не нужно париться за обновление "ручных" мапперов (вдруг их больше одного).
На всякий случай объясню примером - мы добавили новые свойства. Это значит надо найти все мапперы которые используют это свойство. А если этого не сделать то например в ДТО модели будет нулл или пустая коллекция. "Ой", же, разве нет? Как вы такую ситуацию решаете? Разумеется пример применим для энтерпрайз приложений много данных.
Если скажете - "Ну ищем все использования и обновляем", то сразу вопрос - какой шанс не заметить то что делается не так очевидно, например через генерики, рефлексии и т.п. ?
Автомаппер то и решает проблему "ленивых". Он действительно сделает за вас. И в том и другом есть неудобные моменты поддержки.
1
HF
1202 / 791 / 188
Регистрация: 09.09.2011
Сообщений: 2,411
Записей в блоге: 2
22.12.2021, 16:49 28
Случайно наткнулся на статью и сразу вспомнил эту тему. Не смог не рассказать.
Automapper vs Explicit Conversion
И больше всего меня поразили именно тесты. Результаты немного шокировали, даже не верится. Так ли это?

А почему я вообще на такую страницу наткнулся? А потому что узнал ещё один вариант "маппинга" - через implicit/explicit. И мне стало интересно, что умные люди говорят. Теоритически это должно быть точной копией обычного самописанного трансформера. Но вот разница в месте размещения и инициализации разная. "Вдруг есть есть ньюансы", - подумал я и пошёл гуглить. А нашёл статью.
Заодно вопрос - кто-то делает "маппинг" через приведение типов?
0
Эксперт .NET
12563 / 8730 / 1311
Регистрация: 21.01.2016
Сообщений: 32,759
23.12.2021, 07:00 29
Цитата Сообщение от HF Посмотреть сообщение
"Ой", же, разве нет? Как вы такую ситуацию решаете?
Элементарно решаем. Тестируем. Т.е. ещё до QA, врамках простой проверки фичи. Очень сложно не заметить, что новое поле\свойство не появляется там, где должно. В моей практике это работает. И работает совершенно хорошо.

Цитата Сообщение от HF Посмотреть сообщение
Заодно вопрос - кто-то делает "маппинг" через приведение типов?
Я несколько раз делал, но потом перестал. Вроде писанины меньше (в месте "мапирования"), но это настолько неявно получается, что прямо атас. С автомапером хотя бы видно, что тут идёт проецирование. А с приведением неявным даже этого не видно. Так точно делать не стоит.
2
Модератор
Эксперт .NET
15857 / 11003 / 2855
Регистрация: 21.04.2018
Сообщений: 32,331
Записей в блоге: 2
23.12.2021, 15:02 30
Цитата Сообщение от HF Посмотреть сообщение
А потому что узнал ещё один вариант "маппинга" - через implicit/explicit. И мне стало интересно
Для implicit увеличение вероятности багов из-за ошибок при присвоении переменным.
Можно неочевидно создать клоны и при этом не осознавать, что это разные экземпляры.

Для explicit - он просто не даёт никаких преимуществ в сравнении с методом.
Но как-то понятнее, привычнее использовать для создания других экземпляров метод, а (тип) использовать для присвоения ссылки на объект разным типам переменным, без клонирования самого объекта.

Цитата Сообщение от HF Посмотреть сообщение
Результаты немного шокировали, даже не верится.
Моих знаний тоже не хватает для понимания такого результата.
Что бросилось в глаза это создание новых строк и парсинг в Explicit Conversion.
Надо загрузить исходники теста с Гита, посмотреть их и повторить тест.
Если будет на это время когда-нибудь...
0
HF
1202 / 791 / 188
Регистрация: 09.09.2011
Сообщений: 2,411
Записей в блоге: 2
23.12.2021, 16:00 31
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Что бросилось в глаза это создание новых строк и парсинг в Explicit Conversion.
Надо загрузить исходники теста с Гита, посмотреть их и повторить тест.
Если будет на это время когда-нибудь...
Я тоже сначала решил проект глянуть, а оказалось что это вообще другой проект. А эти тесты "использовались при создании этого проекта". Я понял так. То есть взять и потестить не получится. Нужно взять и написать аналогичные тесы по примеру.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для explicit - он просто не даёт никаких преимуществ в сравнении с методом.
Разница есть. Это ещё большая "прозрачность" при конверсии. Но вот преимущество это или нет - это как раз скорее относится к личным предпочтениям.
Боюсь раздуть философскую дискуссию. Но разве нововведния в новых версиях C# всё больше и больше не "засахаривают" разработку? Не уменьшают количество написанного кода? Не делают логику исполнения более "прозрачной" для программиста.
Я бы сравнил explicit конверсию с нововведнием - создание объекта без указания типа. Ну знаете ли, тоже настолько неочевидное и прозрачное действие, что без IDE (просмотр файла в Git например) вы сразу то и не поймёте что там будет за итог. Я против повсеместных "var", а сейчас ещё и типизацию убрали. Что мы получили: "var variable = new(item);". Ну зашибись, облегчили работу жёсткого диска в ущерб очевидности и пониманию.
Я к чему. Если целью является написание кода который выполняет задачу, то explicit очень неплохо вписывается сюда. При продуманной архитектуре, тестах и т.п. он даёт тот же эффект, но меньшее количество кода в местах трансформации.
Разве нет?

А вообще, я против неочевидностей, сахарозы и уменьшению кода.
0
Модератор
Эксперт .NET
15857 / 11003 / 2855
Регистрация: 21.04.2018
Сообщений: 32,331
Записей в блоге: 2
23.12.2021, 16:50 32
Цитата Сообщение от HF Посмотреть сообщение
Боюсь раздуть философскую дискуссию.
Я вот думаю всё разделить данную тему, так как уже ушли от первоначального вопроса.
Но посты (вопросы и ответы) очень запутаны.

Цитата Сообщение от HF Посмотреть сообщение
А вообще, я против неочевидностей, сахарозы и уменьшению кода.
Здесь дело не в сахаре.

А в том что от оператора явного приведения ожидаешь иного поведения.

Пример, типового ожидаемого поведения:
C#
1
2
3
object obj = new MyClass();
OtherType other = (OtherType) obj;
var equals = ReferenceEquals(obj, other); // True
Если же прописать маппинг в explicit, то это будет создание нового экземпляра.
И получаем весьма неочевидное:
C#
3
var equals = ReferenceEquals(obj, other); // False
И даже более:
C#
1
2
3
OtherType other1 = (OtherType) obj;
OtherType other2 = (OtherType) obj;
var equals = ReferenceEquals(other1, other2); // False
Добавлено через 3 минуты
Такое поведение является нормой для значимых типов, но для ссылочных, на мой взгляд, это может привести к путанице и трудноуловимым багам.
0
Эксперт .NET
12563 / 8730 / 1311
Регистрация: 21.01.2016
Сообщений: 32,759
23.12.2021, 16:51 33
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для explicit - он просто не даёт никаких преимуществ в сравнении с методом.
Более того: это решение засирает код класса ненужной для него обязанностью. Ещё более того: не любой мапинг так вообще возможно сделать. Может потребоваться обращение к внешним statefull-сервисам. Или разные сценарии мапинга между двумя сущностями.

Цитата Сообщение от HF Посмотреть сообщение
Разница есть. Это ещё большая "прозрачность" при конверсии.
Эм. Нет. Тут не "прозрачность", тут - неочевидность.

Цитата Сообщение от HF Посмотреть сообщение
Но разве нововведния в новых версиях C# всё больше и больше не "засахаривают" разработку? Не уменьшают количество написанного кода?
Уменьшают, но не делают её волшебной и неочевидной.

Цитата Сообщение от HF Посмотреть сообщение
Я против повсеместных "var"
Почему?

Цитата Сообщение от HF Посмотреть сообщение
Что мы получили: "var variable = new(item);"
Такой код не соберётся. Тип вывести неоткуда.

Цитата Сообщение от HF Посмотреть сообщение
Если целью является написание кода который выполняет задачу, то explicit очень неплохо вписывается сюда. При продуманной архитектуре, тестах и т.п. он даёт тот же эффект, но меньшее количество кода в местах трансформации.
Разве нет?
С одной стороны речь о том, что это хорошо вписывается в код. С другой - о продуманной архитектуре, которая однозначно против размещения кода проекцирования в сущностях. Это противоречивые тезисы.

Цитата Сообщение от HF Посмотреть сообщение
А вообще, я против неочевидностей, сахарозы и уменьшению кода.
Опять же, "сахар" и "уменьшение кода" не значит вред для очевидности.
0
Модератор
Эксперт .NET
15857 / 11003 / 2855
Регистрация: 21.04.2018
Сообщений: 32,331
Записей в блоге: 2
23.12.2021, 16:57 34
Usaga, что скажете по тесту из статьи:
Цитата Сообщение от HF Посмотреть сообщение
Случайно наткнулся на статью и сразу вспомнил эту тему. Не смог не рассказать.
Automapper vs Explicit Conversion
И больше всего меня поразили именно тесты. Результаты немного шокировали, даже не верится. Так ли это?
0
Эксперт .NET
12563 / 8730 / 1311
Регистрация: 21.01.2016
Сообщений: 32,759
23.12.2021, 17:39 35
Элд Хасп, какой-то хреновый тест. Вы видели, ЧТО там сравнивается?) Основной посыл: Automapper не то, что не хуже, он даже немного быстрее. Но там автор упустил один момент, который и сказался на разнице в производительности. Угадаете, какой?)

Добавлено через 6 минут
Вообще, можно сходу уже предположить, что происходит что-то не то в тесте, ибо автомапер один чёрт генерирует код, который равен тому, что написан руками. Т.е. должен быть максимум паритет, за вычетом первоначального штрафа на генерацию. Но уж никак не преимущество.
0
HF
1202 / 791 / 188
Регистрация: 09.09.2011
Сообщений: 2,411
Записей в блоге: 2
23.12.2021, 17:44 36
Цитата Сообщение от Usaga Посмотреть сообщение
Такой код не соберётся. Тип вывести неоткуда.
Конечно есть откуда. Вы в IDE то весь код можете посмотреть или мышкой навести на "item". Да, согласен, поторопился я с примером. Накидал быстрый пример о чём я хотел сказать.
C#
1
2
3
4
5
6
7
8
9
    MyClass item1 = null;
 
// пример 1
.... тут десяток строк или вообще другие классы
    item1 = new();
 
// пример 2
.... тут десяток строк или вообще другие классы
    var list = new[] { item1 };
где в строке инициализации - без IDE никогда не поймёшь что там вообще будет.

Добавлено через 2 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
Вообще, можно сходу уже предположить, что происходит что-то не то в тесте, ибо автомапер один чёрт генерирует код, который равен тому, что написан руками. Т.е. должен быть максимум паритет, за вычетом первоначального штрафа на генерацию. Но уж никак не преимущество.
Именно это меня и сильно удивило и заинтересовало. Но скорее я поверю в то что или "есть ньюанс", или тестировалось неверно. О каком моменте вы намекали?
0
Эксперт .NET
12563 / 8730 / 1311
Регистрация: 21.01.2016
Сообщений: 32,759
23.12.2021, 17:45 37
HF, мой докапон был именно к вашему фрагменту кода) Понятно, что вы там ошиблись)

Но смотрите какое дело: я последние лет пять или шесть постоянно использую var и для меня (и моих коллег, которые ревьювят мой код) это не вызывает когнитивной нагрузки. Т.е. сидя в TortoiseHG не возникает необходимости запустить IDE и посмотреть какой же там реально тип. И просто при просмотре кода в IDE тоже.

Т.е. проблема явно надуманная. В большинстве случаев, вам и не интересно знать какой там тип откуда прилетел и куда полетел.
0
Модератор
Эксперт .NET
15857 / 11003 / 2855
Регистрация: 21.04.2018
Сообщений: 32,331
Записей в блоге: 2
23.12.2021, 17:45 38
Цитата Сообщение от Usaga Посмотреть сообщение
Но там автор упустил один момент, который и сказался на разнице в производительности. Угадаете, какой?)
Ну, я сразу написал:
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Что бросилось в глаза это создание новых строк и парсинг в Explicit Conversion.
AutoMapper не использую.
Поэтому возможно упускаю ещё что-то.
На уровне моих знаний, он работает через рефлексию и ни при каких условиях в равных задачах не может быстрее.
0
Эксперт .NET
12563 / 8730 / 1311
Регистрация: 21.01.2016
Сообщений: 32,759
23.12.2021, 17:49 39
Цитата Сообщение от HF Посмотреть сообщение
О каком моменте вы намекали?
Посмотрите на ручной маппинг и подумайте, как Automapper заполняет свойство FullName. Отвечу: никак. Он не знает как и пропускает (оно не подпадает под соглашение). Поэтому профиль автомапера и быстрее. Если после конфигурирования автомапера вызвать AssertConfigurationIsValid();, то вы получите исключение, где автомапер скажет, что не знает как смапить это свойство.

Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
AutoMapper не использую.
Поэтому возможно упускаю ещё что-то.
На уровне моих знаний, он работает через рефлексию и ни при каких условиях в равных задачах не может быстрее.
Вы ничего не упускаете. Автомапер использует рефлексию, но только при первом мапинге. Когда ему нужно сгенерировать мапперы. После этого производительность строго та же, что у вручную написанного кода. Плюс-минус. Проблемы автомапера не в производительности мапинга.
0
Модератор
Эксперт .NET
15857 / 11003 / 2855
Регистрация: 21.04.2018
Сообщений: 32,331
Записей в блоге: 2
23.12.2021, 17:51 40
Цитата Сообщение от Usaga Посмотреть сообщение
как Automapper заполняет свойство FullName
Я это и имел ввиду.
И мне ещё не нравится преобразование в строку и обратно для свойства Id.
Как-то уж очень подозрительно выглядит.
Поэтому и хотел посмотреть исходники (которых как оказалось нет).
0
23.12.2021, 17:51
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.12.2021, 17:51
Помогаю со студенческими работами здесь

Как работать с массивом в котором есть объект и вложенный массив?
let user = , { name:'abc', cost:'5', numbers:, count:{ props:4, ...

Как записать вложенный оператор If внутри другого оператора If, чтобы добиться нужного эффекта?
Добрый день, подскажите пожалуйста почему не правильно отрабатывает макрос? Суть задачи, есть...

Терминология: Класс, объект, экземпляр, сущность. (Дейт о путанице в этой сфере)
О некоторых проблемах терминологии, которые ещё и осложняются тем, что термины кочуют по смежным...

Как настроить форму обратной связи под себя? (файлы внутри)
Взял одностраничник и хочу настроить форму чтобы сообщения приходили на мою почту... где нужно...

Как поведет себя Timer, если код внутри него, не успел выполниться?
Допустим есть у меня timer, который срабатывает раз в несколько секунд. Внутри некий код, который...

Вложенный объект
Как в своём классе создать вложенный объект?


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
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.b­y
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
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru