Слоёная архитектура на примере C# и Dapper

  Рет қаралды 9,444

Програмысли Влог

Програмысли Влог

2 жыл бұрын

Поддержать меня: boosty.to/mflenov
Я бы не сказал, что код в примере идеальный, но это один из вариантов реализации слоёной архитектуры, с которым я не раз встречался по работе в разных компаниях. В одной из компаний где я работал прям очень много используется такой подход. Даже если вам не нравится подобная организация кода, познакомится с ней будет полезно.
Обо мне: www.flenov.ru
Мой ИТ блог www.flenov.ru и www.flenov.info
Мой просто блог blo.moe
Tweeter: / flenov
Инстаграмм: / mflenov
Телеграмм: t.me/mflenov
#ityoutubersru
#ityoutubers

Пікірлер: 68
@user-jb7xp6ms3j
@user-jb7xp6ms3j 2 жыл бұрын
Dapper выглядит просто божественно для мапинга данных
@t3m8ch2
@t3m8ch2 2 жыл бұрын
Хотим больше про архитектуру
@user-mi4oo7tt1x
@user-mi4oo7tt1x 2 жыл бұрын
Спасибо большое! Это поможет мне с проектом на моей новой работе!
@Dev-lessons
@Dev-lessons 2 жыл бұрын
В Канаде?
@user-mi4oo7tt1x
@user-mi4oo7tt1x 2 жыл бұрын
@@Dev-lessons в России. До Канады пока не вырос профессионально
@AlexeyDevyatov
@AlexeyDevyatov 2 жыл бұрын
Спасибо за урок
@Mr43046721
@Mr43046721 2 жыл бұрын
Думал что-то у меня со звуком в некоторых моментах (Хром обновился, беспроводные уши тупят), но вроде это просто Михаил сам себя ускоряет в нек-рых моментах, создавая робовойс)) Пасиб за видео) как всегда - класс
@Dev-lessons
@Dev-lessons 2 жыл бұрын
Да, я делал ускорения, чтобы ускорить моменты. в которых я просто печатал
@TbIPDblM
@TbIPDblM Жыл бұрын
Даппер это прекрасно -)
@terabucks
@terabucks 9 ай бұрын
Спасибо. Мне было полезно и интересно. Только осваиваю.
@SuperWolchara
@SuperWolchara 2 жыл бұрын
Круть с расширением Dapper так просто sql запосы переводить в модель, архитектура тоже интересная надо будет с новым проектом заюзать
@musamusa1438
@musamusa1438 2 жыл бұрын
спасибо, классно!!!
@StarininAndrey
@StarininAndrey 2 жыл бұрын
Буду студентам рекомендовать к просмотру. Чтобы видели, что не я один похожие вещи им пытаюсь объяснить.
@vd3598
@vd3598 2 жыл бұрын
Михаил, расскажите, пожалуйста, подробнее про DI. А именно, почему Вы используете для дата и бизнес сервисов singleton lifetime? Для меня вот сейчас это дилемма, поскольку мой предыдущий лид настаивал на transient или scoped by default, а нынешний настаивает на singleton by default. И в целом у обоих были на это свои аргументы. Сори, если уже было где то)
@Dev-lessons
@Dev-lessons 2 жыл бұрын
Тут зависит от того, как работает класс. Если у класса нет состояния, как в моем случае, он может быть синглтоном - один единственный вариант класса будет использоваться на все запросы. Если у класса есть состояние, например у класса есть свойство CreditCard с номером кредитной карты текущего польозвателя. Такое просто запрещено использовать как синглтон, должен быть какой-то скоп - например текущий запрос, который станет границей для данных в состоянии. Как только пришел новый запрос, создается новый объект.
@headdyson8297
@headdyson8297 Жыл бұрын
А нужно ли в работе с Даппер создавать модельки и ДТОшки отдельно между слоями и маппить их друг с другом или лучше просто с теми же моделями работать по всему проекту? На EF core мы разделяем между internal models и external models, но с даппером все эти модельки они и есть ДТО и часто приходится создавать новую модель если вдруг мне нужны доп. данные с других таблиц, а если создавать еще под каждую модель ДТО то это просто дублировать код, интересно будет услышать.
@Dev-lessons
@Dev-lessons Жыл бұрын
Можно, но нужно понимать, что это будет нагрузка на сборщик мусора, потому что все эти модели будут жить недолго.
@IusupFaizrakhmanov
@IusupFaizrakhmanov 2 жыл бұрын
А смысл в BL возвращать null при вызове Authenticate? Не лучше ли выкидывать исключения в случаях, если юзер не прошел аутентификацию?
@Dev-lessons
@Dev-lessons 2 жыл бұрын
конечно же в реальном приложении нужна хорошая ошибка, а не NULL
@andrewdirrell7497
@andrewdirrell7497 2 жыл бұрын
Я слышал, что на собеседованиях в FAANG (и не только, конечно), задают вопросы по архитектуре. Не могли бы вы осветить эту тему?
@Dev-lessons
@Dev-lessons 2 жыл бұрын
Я в FAANGах не работал, поэтому не знаю
@Mr43046721
@Mr43046721 2 жыл бұрын
Михаил, а что вы думаете про MediatR ? И вообще, нужно ил его применять, делая апи контроллеры максимально легковесными?
@Dev-lessons
@Dev-lessons 2 жыл бұрын
Для своих задач можно использовать.
@techbuterbrod
@techbuterbrod 2 жыл бұрын
У нас на работе юзают CQRS паттерн, с точки зрения написания кода и отлова ошибок - ОЧЕНЬ удобно. Но негативно влияет на производительность. Если не боритесь за доли секунды в запросах, то есть смысл юзать на больших проектах.
@sergegindin1658
@sergegindin1658 Жыл бұрын
@@techbuterbrod был хайп в одно время что медиатр медленный и что он на порядок или даже несколько хуже обычного вызова. Это верно, но речь идет здесь даже не за доли секунды а за милисекунды поэтому лучше сосредоточиться на читаемости кода. Предполагаю вам никогда в рамках оптимизации не придется заменять MediatR чем либо.
@maflend2762
@maflend2762 2 жыл бұрын
Классно круто, я так понимаю dal модели это аналоги dto моделей? Или это две разные истории😊
@Dev-lessons
@Dev-lessons 2 жыл бұрын
Саязанные. DAL- Data Access Layer, или уровень доступа к даным. DTO - Data Transfer Objects - модели. DAL - это код доступа к данным, а DTO - это User класс - модель, в которой хранятся данные, которые передаются от базы в DAL, а потом в BL
@shakotkopavlo
@shakotkopavlo 2 жыл бұрын
Здраствуйте! Я знаю что вопрос немного не по теме, но, на какую примерно уровень з\п может расчитывать .NET Middle программист с 3+ годами работы? Напрмер в той компании в которой Вы сейчас работаете или вообще по Вашей провинции
@Dev-lessons
@Dev-lessons 2 жыл бұрын
Если ты ты только приехал в Канаду, то тебе можно пробоваться на мидла и это 100к в год.
@shakotkopavlo
@shakotkopavlo 2 жыл бұрын
@@Dev-lessons Спасибо! Ещё на приехал пока, но из за войны в Украине и упрощенной иммиграции для украинцев планирую это делать. Это я так понимаю з\п в CAD?
@Dev-lessons
@Dev-lessons 2 жыл бұрын
@@shakotkopavlo Да, это канадский доллар. Про расходы в Канаде можешь узнать здесь kzbin.info/www/bejne/kIu8eZyGrNSpmLc цены за последнее время выросли немного, сейчас инфляция в Канаде достигает 6% официально, бензин уже $2, квартиры даже аренда уже выше, а покупка не менее миллиона, но все равно, примерно расклад можно узнать. Вообще по канаде информацию можешь еще здесь смотреть www.besed.ca
@aziznortozhiev5342
@aziznortozhiev5342 2 жыл бұрын
Обычно когда говорят об onion архитектуре, ссылаются на универсальность, что можно потом их использовать на разных архитектурах, для MVC/Rest Api/WinForms. Так вот, у меня такая задача что нужно предоставить три интерфейса, десктопное приложение Dot Net, swagger доступ, и MVC приложение на Net Core. Архитектура у меня-Onion(DAL, DOMAIN, CORE...), пока писал для WinForms(DotNet) через Net Standart, net core успели выпустить c 3.0 на 6.0. Совместимости упомянутых(Dotnet, NetStandart, Net Core) платформ отвратительны. Никакого инструктажа нету. Делаю как получается, на Winforms поддерживает до Net Core Entity Framework 3.12, делаю на нем бизнес логику/доступ к бд через UnitOfWork/Repositories, потом эту бизнес логику могу использовать на Net Core веб проектах. Как правильно написать слои(DAL включительно), чтобы можно было использовать везде?
@Dev-lessons
@Dev-lessons 2 жыл бұрын
REST API в Web приложении делать, тогда приложению будет все равно, на каком стандарте написан бакенд
@yava43
@yava43 11 ай бұрын
зачем сервисы добавляем как Singletone? для подобных сервисов используется Transient
@Dev-lessons
@Dev-lessons 11 ай бұрын
Почему для подобных сервисов используется именно Transient? почему не Scoped или Singletone?
@yava43
@yava43 11 ай бұрын
лишнее место в памяти занимает. transient создает объект только когда это необходимо@@Dev-lessons
@Dev-lessons
@Dev-lessons 11 ай бұрын
Причём при каждом обращении, а в нагруженной системе ты представляешь сколько раз будет инициализироваться объект и уничтожаться? При 1000 запросах в секунду минимум 1000 выделений и освобождений, а у меня один раз будет создан класс и сборщик мусора будет сидеть и кайфовать.
@EoLienFive
@EoLienFive 9 ай бұрын
А есть ли у вас пример разбиения архитектуры не на папки, а на отдельные проекты как class library?
@Dev-lessons
@Dev-lessons 9 ай бұрын
Именно видео такого нет, но не вижу проблем папки перенести в отдельные проекты. На бусти у меня много практики
@baxram97
@baxram97 Жыл бұрын
А почему не используете EF Core?
@Dev-lessons
@Dev-lessons Жыл бұрын
Очень подробно рассказал здесь kzbin.info/www/bejne/Y6POaYyhiaeNmdU Если коротко, я люблю сам писать SQL, чтобы контролировать его, а не надеется на то, что будет сгенерировано. Как видишь по видео, мне не сложно написать SQL.
@techbuterbrod
@techbuterbrod 2 жыл бұрын
Ну не сказал бы, что модель написать 5 секунд. У нас больше двух сотен моделей и в каждой в среднем по 40 полей, а бывает и до сотни. Я уж молчу про то, что там есть связи с модели на модель, т.е. джойны между таблицами, к которым потом можно обращаться, например, через .include в LINQ. Производительность, конечно, хорошо, но как по мне такое себе удовольствие все это руками делать. Особенно, если все это дело внедряется не на проект с нуля, а на уже давно существующий. Тут EF Core очень помогает. Тем более постоянно создаются новые поля в моделях и все это контролировать на валидность вручную не так просто, мне кажется. Надеюсь, что мысль донес верно. А так спасибо за видео! Было интересно. P.S. Правильно я понял, что SQL-запросы при работе с Dapper никак не проверяются на работоспособность при написании?
@Dev-lessons
@Dev-lessons 2 жыл бұрын
Ну так используй генератор, напиши свой. Его написать можно за час. SQL конечно не проверяется, это же текст
@user-zk4dt2mu9f
@user-zk4dt2mu9f Жыл бұрын
40 полей в модели? Так получается в табличке почти столько же? Что ж там храните?
@user-ii9xe4pu6x
@user-ii9xe4pu6x 2 жыл бұрын
Михаил, так ты вместо IUserRepository используешь IUserDAL. А ты говорил что не любишь эти репозитории, но далеко не ушёл.
@Dev-lessons
@Dev-lessons 2 жыл бұрын
То, что IUserDAL используется в BL, это не делает его репозиторием, он не является им и работает по другому
@vd3598
@vd3598 2 жыл бұрын
@@Dev-lessons Михаил, а можно Вас попросить, более подробно рассказать, в чем разница между DAL и Repository, о которой вы говорите? Просто я в работе с DAL не сталкивался, и то, что мы делаем с репозиториями как по мне идеологически похоже на то, что Вы показали в видео.
@Dev-lessons
@Dev-lessons 2 жыл бұрын
@@vd3598 Разный подход к реализации DAL. Репозиторий может выполнять функции DAL и когда он работает как DAL, мне не нравится это. Тут все вопрос в том, как реализовывать DAL, в виде функций для доступа к данным или в виде репозитория.
@user-zk4dt2mu9f
@user-zk4dt2mu9f Жыл бұрын
@@vd3598 Репозиторий , это штука выполняющая роль провайдера "собранных" данных. Т.е. в случае с DAL мы бы потянули просто данные из таблицы как есть. И в случае когда есть FK в такой таблице, никакими Join бы не занимались. Репозиторий, в зависимости от логики, зачастую отдал бы "нормальные" данные, сджойнив их как надо. Ну а путаница потому, что в реляционных БД все забивают на NF, и делают как есть. В итоге данные и представление данных смешивается в 1 таблице. И получается что репозиторий начинает выполнять роль DAL
@IgorGallemar
@IgorGallemar 2 жыл бұрын
Первый!!!
@Dev-lessons
@Dev-lessons 2 жыл бұрын
Судя по админке Сергей первый.
@IgorGallemar
@IgorGallemar 2 жыл бұрын
@@Dev-lessons странно, но времени у нас разрыв в минуту ☝️
@user-ii9xe4pu6x
@user-ii9xe4pu6x 2 жыл бұрын
Михаил, что-то мне подсказывает, что ты не так свои приложения пишешь. Ты можешь показать какой-нибудь пример того как ты на самом деле пишешь?
@Dev-lessons
@Dev-lessons 2 жыл бұрын
А есть «правильно» и «неправильно»? А я думал, что есть различные подходы и кто-то выбирает один подход, а кто-то другой.
@user-ii9xe4pu6x
@user-ii9xe4pu6x 2 жыл бұрын
@@Dev-lessons Михаил, ну про «правильно» или «неправильно» я ничего не говорил)) А то, что есть различные подходы и кто-то выбирает один подход, а кто-то другой - это совершенно верно. Так о том-то и речь, что подход который ты показал в примере, то я сильно сомневаюсь что ты его выбираешь. Ты показал пример того, что ты встречал в других компаниях, а мне хочется увидеть твой) Я рос на твоих книгах "Библия Delphi" и "Библия C# и сейчас хочу расти дальше, но уже больше в архитектуре.
@Dev-lessons
@Dev-lessons 2 жыл бұрын
@@user-ii9xe4pu6x Я видел кто-то писал про правильно и отвечал на тот комментарий, но видимо попал под твой случайно. Как я пишу - зависит от ситуации. Но в слоеной архитектуре я чуть по другому делаю и обязательно запишу видео.
@user-ii9xe4pu6x
@user-ii9xe4pu6x 2 жыл бұрын
@@Dev-lessons Михаил, ты лучший!!!
@user-wp6pd2fx8g
@user-wp6pd2fx8g 2 жыл бұрын
Первый?)
@fentan6806
@fentan6806 Жыл бұрын
Почему ты в Канаде программистом имеешь слабый пк?
@Dev-lessons
@Dev-lessons Жыл бұрын
Это Windows ноут, который мне мощный не нужен, у меня есть mac на m2 для основных задач. Но если ты считаешь, что в Канаде у всех только крутые компьютеры, то ты наверно не живешь в Канаде, потому что такого стериотипа не было бы. Про зарплаты программистов я рассказывал на основном канале kzbin.info/www/bejne/lXSploWbYtB-j6M
@fentan6806
@fentan6806 Жыл бұрын
@@Dev-lessons а ну лан
@yava43
@yava43 11 ай бұрын
это была попытка реализовать паттерн репозиторий? ниче не понимаю.........
@Dev-lessons
@Dev-lessons 11 ай бұрын
просто слойная архитектура, репозитория тут нет
@borisgarin8311
@borisgarin8311 Жыл бұрын
Здравствуйте. Как организовать сопоставление сущности на 2 и более inner join (left join, right join)? Пример SQL запроса: SELECT * FROM Products INNER JOIN Manufacturers ON Products.ManufacturerId=Manufacturers.Id INNER JOIN Categories on Products.CategoryId=Categories.Id.
@Dev-lessons
@Dev-lessons Жыл бұрын
Вижу два inner, визуально даже выглядит верно. Точно также сделай два left
@borisgarin8311
@borisgarin8311 Жыл бұрын
@@Dev-lessonsСпасибо. Я понял, как это сделать в SQL, но как возвести модель из результата такого запроса. Через spiltOn видел примеры только на 2 таблицы (один JOIN)? В EF подобное: _context.Products.Include(p=>p.Manufacturer).Include(p=>p.Category).ToList(); А в Dapper? Получить объект на основе JOIN-ов.
@Dev-lessons
@Dev-lessons Жыл бұрын
@@borisgarin8311 В Dapper есть два варианта - создать модель, которая будет состоять из всех колонок всего запроса - нужно если связанные таблицы возвращают небольшие данные. Второй - самому замапить данные в Products.Manufacturer.Category. Ручной вариант может быть - выполнить три запроса и замапить. Тут зависит от ситуации.
@borisgarin8311
@borisgarin8311 Жыл бұрын
@@Dev-lessons Спасибо.
Умная CMS на .NET 6
33:33
Програмысли Влог
Рет қаралды 3,3 М.
Чистая архитектура ASP.NET Core 7
25:20
Excalib
Рет қаралды 11 М.
Did you believe it was real? #tiktok
00:25
Анастасия Тарасова
Рет қаралды 46 МЛН
아이스크림으로 체감되는 요즘 물가
00:16
진영민yeongmin
Рет қаралды 9 МЛН
OMG🤪 #tiktok #shorts #potapova_blog
00:50
Potapova_blog
Рет қаралды 18 МЛН
버블티로 체감되는 요즘 물가
00:16
진영민yeongmin
Рет қаралды 106 МЛН
Создаем масштабируемую архитектуру
14:56
Собеседование: несколько вопросов про Bash
2:21
Базы данных и программирование
Рет қаралды 174
SQL Injection - теория и примеры
13:17
Програмысли Влог
Рет қаралды 22 М.
C# Dapper Introduction
9:06
tutorialsEU - C#
Рет қаралды 16 М.
Марк Шевченко - Микросервисы на C#
1:02:10
Как реализовать сервис с CQRS | Mediator
16:40
ПРОГРАММИРОВАНИЕ НА C# - DAPPER
14:12
АйтишныйДомосед
Рет қаралды 6 М.
Что такое MVC за 4 минуты
4:02
Listen IT
Рет қаралды 34 М.
Did you believe it was real? #tiktok
00:25
Анастасия Тарасова
Рет қаралды 46 МЛН