|
0 / 0 / 2
Регистрация: 11.06.2015
Сообщений: 60
|
||||||
Инициализация AutoMapper04.02.2018, 12:40. Показов 5924. Ответов 18
Метки automapper (Все метки)
Здравствуйте. Создаю ASP.NET MVC проект, с трехслойной архитектурой (DataAccess, BusinessLogic, PresentationLayer). В BusinessLogic есть DTO сущности для передачи данных из DAL в PresentationLayer, в котором, в свою очередь есть ViewModel'и для передачи данных в представления. Для маппинга данных из одних сущностей на другие использую AutoMapper v6.2.2. В PresentationLayer, в Global.asax (в Application_Start()) вызываю
Вопрос: где производить CreateMap<> для сущностей DAL и BLL? Если еще раз вызвать Mapper.Initialize(cfg => ..... в слое BLL, То будет исключение : Mapper already initialized. You must call Initialize once per application domain/process. В Global.asax (в Application_Start()) в слое PresentationLayer я не могу вызвать cfg.CreateMap<SomeDALEntity, Some_DTO>(), поскольку в PresentationLayer придется дабавлять ссылку на DAL, что делает бессмысленным многослойную архитектуру приложения. Заранее спасибо.
0
|
||||||
| 04.02.2018, 12:40 | |
|
Ответы с готовыми решениями:
18
Для чего нужен Automapper?
|
|
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,227
|
|||
| 04.02.2018, 12:56 | |||
|
одни и те же вью модели из BLL. Поскольку вью-модели не зависят от вьюх.
0
|
|||
|
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
|
||
| 04.02.2018, 13:01 | ||
|
Каждый слой ничего не знает о вышележащих слоях , значит , если слою BLL нужен Mapper для DAL модели . он вправе его использовать , так же как и PresentationLayer не обязан понимать что творится внутри BLL , т.е так же вправе вызвать Mapper моделей BLL на свои модели представления. Но , раз уж Mapper такой себе singleton , наверняка есть возможность проверить была ли инициализация и сбросить ее.
Добавлено через 2 минуты
0
|
||
|
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,227
|
|||
| 04.02.2018, 13:11 | |||
|
Если стоит задача сменить графическую платформу, при этом все воркфлоу остаются теми же самыми (например, при переходе от десктопа на веб), то получается надо заново писать вьюмодели для веба? - Логично, что не надо этого делать. Ведь вьюмодели не должны зависеть от вьюх, поэтому пихаем вьюмодели в BLL. Повторюсь, это ведь тоже модели. Добавлено через 1 минуту
0
|
|||
|
0 / 0 / 2
Регистрация: 11.06.2015
Сообщений: 60
|
|
| 04.02.2018, 13:57 [ТС] | |
|
IamRain, спасибо вам за участие, но я бы рекомендовал вам почитать что-то на тему SOLID принципов, или вот это https://metanit.com/sharp/mvc5/23.5.php.
sau - по поводу "сбросить инициализацию" - да такая возможность есть, но в доках сказано что методом Reset() не рекомендуется пользоваться "на проде": Resets the mapper configuration. Not intended for production use, but for testing scenarios. Та и потом, если например, где-нибудь в BLL его скинуть, то потом в PresentationLayer опять нужно будет инициализировать, а с Global.asax так не получится; а пихать инициализатор еще куда-нибудь в слое PresentationLayer, с , опять-таки проверкой на то, был ли маппер инициализирован ранее - это уже избыток... Просто не хочется изобретать колесо.... Думаю уже кто-то с подобным сталкивался, хочется какое-то "правильное"решение.
0
|
|
|
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,227
|
|
| 04.02.2018, 14:17 | |
|
plusok, насколько я помню в рабочем проекте мы именно в DAL и иницализируем маппинг, причем сразу для всех сущностей из BLL, через рефлексию. + Используется свой convention по именованию сущностей.
Получается, есть базовый класс репозитория, который иницализирует маппинг, а все остальный репозитории от него наследуются. В любом репозитории маппинг уже на блюдечке, типа того. Вот и все.
0
|
|
|
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
|
|||
| 04.02.2018, 17:33 | |||
|
Естественно , что для каждого этапа безнеспроцесса могут быть разные виды обслуживающих его приложений , со своим пользовательским интерфейсом , или без него - в случае каких либо фоновых процессов/сетевых сервисов , решающих свой круг задач в рамках общего бизнеспроцесса. , но при этом все они взаимодействуют через общую бизнес логику. По этому и вью.моделей будет множество для разных UI , если есть общая вью.модель она может быть вынесена в доменную для UI , а BLL тем временем живет своей жизнью и ей совершенно по барабану какие у нее клиенты в виде тех или иных приложений уровня пользователя. Короче , UI модель обслуживает конкретный тип интерфейса. и должна располагаться в ближайшим к нему слое. (архитектуру UI так же можно подразделить на несколько локальных слоев , тот же MVP обеспечит общий подход в логике UI как для веба так и для десктопа , но это не значит что этот слой нужно помещать в BLL) Добавлено через 6 минут
Т.е я понимаю бизнес процесс и его логику - как некое большое облако различных сервисов , к которым может подключиться пользователь с помощью того или иного UI , и тот или иной UI имеет свою логику взаимодействия с пользователем - чисто в плане как управлять кнопочками и т.п (не без оглядки на логику BL) , ну и соответствующую вспомогательную UI модель.
0
|
|||
|
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,227
|
|||
| 04.02.2018, 17:42 | |||
|
Зачем для каждой View писать View Model? View Model не зависит от View-хи, на то она и ViewModel. Допустим, спроектировали наше большое приложение. Сформировали основные use case-ы, в одном из use case-ов определили activity - редактирование данных пользователя (DetailView). Модели ведь не должны зависеть от вьюх, в этом вы согласны со мной? Так кот зачем при смене UI например с WinForms на ASP MVC переписывать ViewModel? На крайняк, разве что повесить на ViewModel дополнительно описывающие метаданные с помощью атрибутов (одна строка кода во вью-модели - единственное изменение) и все, ничего более. Добавлено через 5 минут Вообщем, ключевая фраза - логика взаимодействия пользователя с view не меняется, поэтому не меняется ViewModel, меняется только View.
0
|
|||
|
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
|
||||
| 04.02.2018, 18:00 | ||||
|
Добавлено через 5 минут Мы же не говорим о монолитном и раз написанном приложении , разделение на слои подразумевает повторное использование в различных местах , где Presentation layer в какой то степени может быть повторно использован , но гораздо в меньшей степени чем BLL или DAL. Я , например , разработчик api веб.сервиса для BLL , и тут мне в сборке суют какие то ViewModel_и специфичных UI , нахрена они мне в моем rest api сервисе, спрошу я ? Ладно , я уже повторяюсь , пущай и другими словами , мысль надеюсь донес . дальше сами ).
0
|
||||
|
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,227
|
||
| 04.02.2018, 18:02 | ||
Ну да ладно, не хочу спорить.
0
|
||
|
0 / 0 / 2
Регистрация: 11.06.2015
Сообщений: 60
|
||
| 04.02.2018, 18:07 [ТС] | ||
|
0
|
||
|
0 / 0 / 2
Регистрация: 11.06.2015
Сообщений: 60
|
|
| 04.02.2018, 19:35 [ТС] | |
|
PresentationLayer ничего не должен знать о DAL
0
|
|
|
|
|||||||||||||||||||||||||||
| 04.02.2018, 22:10 | |||||||||||||||||||||||||||
|
вообще идея такая - MyApp.Core
0
|
|||||||||||||||||||||||||||
|
1524 / 510 / 126
Регистрация: 09.01.2018
Сообщений: 1,547
|
|||||||||||
| 05.02.2018, 11:38 | |||||||||||
|
plusok, не знаю зачем вам понабился DTO. При внедрении зависимости проект получает все зависимости проекта от которого он зависит. Т.е. если у вас BLL зависит от DAL, а UI зависит от BLL, UI получит все зависимости BLL и объекты DAL будут доступны на уровне UI. Это ж лишняя работа, лишний репозиторий.
Но если уж надо именно так, то схема следующая. Automapper инициализируется действительно один раз, в StartUp. Пакет его устанавливается в BLL и он будет доступен из UI. В UI устанавливается пакет AutoMapper.Extensions.Microsoft.Dependen cyInjection И в StartUp
В StartUp прописываете оба репозитория и указываете, что в конструктор обоим следует передать IMapper, который получаете из сервисов. Ну и все.
1
|
|||||||||||
|
0 / 0 / 2
Регистрация: 11.06.2015
Сообщений: 60
|
||||||
| 05.02.2018, 13:29 [ТС] | ||||||
|
escoult, спасибо. Вот это похоже.... позже попробую - отпишусь.
Добавлено через 12 минут Так же , как вариан попробовать инициализацию маппера не статически, а через экземпляры класса MapperConfiguration :
0
|
||||||
|
1524 / 510 / 126
Регистрация: 09.01.2018
Сообщений: 1,547
|
||
| 05.02.2018, 14:21 | ||
|
plusok, поправлю сам себя
0
|
||
|
0 / 0 / 2
Регистрация: 11.06.2015
Сообщений: 60
|
|
| 05.02.2018, 15:47 [ТС] | |
|
Спасибо
0
|
|
| 05.02.2018, 15:47 | |
|
Помогаю со студенческими работами здесь
19
Automapper и List<T> AutoMapper - не может споставить данные AutoMapper error. Как правильно проецировать complex type? При мапинге automapper-ом many-to-many releation делает множество заявок к базе вместо одной Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|