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

Поділитися
Вставка
  • Опубліковано 29 січ 2025

КОМЕНТАРІ • 68

  • @t3m8ch2
    @t3m8ch2 2 роки тому +7

    Хотим больше про архитектуру

  • @ДенисК-р6я
    @ДенисК-р6я 3 роки тому +5

    Dapper выглядит просто божественно для мапинга данных

  • @Mr43046721
    @Mr43046721 3 роки тому +4

    Думал что-то у меня со звуком в некоторых моментах (Хром обновился, беспроводные уши тупят), но вроде это просто Михаил сам себя ускоряет в нек-рых моментах, создавая робовойс)) Пасиб за видео) как всегда - класс

    • @Dev-lessons
      @Dev-lessons  3 роки тому +1

      Да, я делал ускорения, чтобы ускорить моменты. в которых я просто печатал

  • @BorisMinin
    @BorisMinin 3 роки тому +3

    Спасибо большое! Это поможет мне с проектом на моей новой работе!

    • @Dev-lessons
      @Dev-lessons  3 роки тому +2

      В Канаде?

    • @BorisMinin
      @BorisMinin 3 роки тому

      @@Dev-lessons в России. До Канады пока не вырос профессионально

  • @TbIPDblM
    @TbIPDblM Рік тому +2

    Даппер это прекрасно -)

  • @SuperWolchara
    @SuperWolchara 3 роки тому +3

    Круть с расширением Dapper так просто sql запосы переводить в модель, архитектура тоже интересная надо будет с новым проектом заюзать

  • @IusupFaizrakhmanov
    @IusupFaizrakhmanov 2 роки тому +2

    А смысл в BL возвращать null при вызове Authenticate? Не лучше ли выкидывать исключения в случаях, если юзер не прошел аутентификацию?

    • @Dev-lessons
      @Dev-lessons  2 роки тому +1

      конечно же в реальном приложении нужна хорошая ошибка, а не NULL

  • @AlexeyDevyatov
    @AlexeyDevyatov 3 роки тому +3

    Спасибо за урок

  • @Mr43046721
    @Mr43046721 3 роки тому +2

    Михаил, а что вы думаете про MediatR ? И вообще, нужно ил его применять, делая апи контроллеры максимально легковесными?

    • @Dev-lessons
      @Dev-lessons  3 роки тому

      Для своих задач можно использовать.

    • @mechanism-o4h
      @mechanism-o4h 2 роки тому

      У нас на работе юзают CQRS паттерн, с точки зрения написания кода и отлова ошибок - ОЧЕНЬ удобно. Но негативно влияет на производительность. Если не боритесь за доли секунды в запросах, то есть смысл юзать на больших проектах.

    • @sergegindin1658
      @sergegindin1658 2 роки тому

      @@mechanism-o4h был хайп в одно время что медиатр медленный и что он на порядок или даже несколько хуже обычного вызова. Это верно, но речь идет здесь даже не за доли секунды а за милисекунды поэтому лучше сосредоточиться на читаемости кода. Предполагаю вам никогда в рамках оптимизации не придется заменять MediatR чем либо.

  • @headdyson8297
    @headdyson8297 Рік тому

    А нужно ли в работе с Даппер создавать модельки и ДТОшки отдельно между слоями и маппить их друг с другом или лучше просто с теми же моделями работать по всему проекту?
    На EF core мы разделяем между internal models и external models, но с даппером все эти модельки они и есть ДТО и часто приходится создавать новую модель если вдруг мне нужны доп. данные с других таблиц, а если создавать еще под каждую модель ДТО то это просто дублировать код, интересно будет услышать.

    • @Dev-lessons
      @Dev-lessons  Рік тому

      Можно, но нужно понимать, что это будет нагрузка на сборщик мусора, потому что все эти модели будут жить недолго.

  • @terabucks
    @terabucks Рік тому

    Спасибо. Мне было полезно и интересно. Только осваиваю.

  • @shakotkopavlo
    @shakotkopavlo 2 роки тому +1

    Здраствуйте! Я знаю что вопрос немного не по теме, но, на какую примерно уровень з\п может расчитывать .NET Middle программист с 3+ годами работы? Напрмер в той компании в которой Вы сейчас работаете или вообще по Вашей провинции

    • @Dev-lessons
      @Dev-lessons  2 роки тому

      Если ты ты только приехал в Канаду, то тебе можно пробоваться на мидла и это 100к в год.

    • @shakotkopavlo
      @shakotkopavlo 2 роки тому

      @@Dev-lessons Спасибо! Ещё на приехал пока, но из за войны в Украине и упрощенной иммиграции для украинцев планирую это делать. Это я так понимаю з\п в CAD?

    • @Dev-lessons
      @Dev-lessons  2 роки тому +1

      @@shakotkopavlo Да, это канадский доллар. Про расходы в Канаде можешь узнать здесь ua-cam.com/video/ZZYHiPwovbU/v-deo.html цены за последнее время выросли немного, сейчас инфляция в Канаде достигает 6% официально, бензин уже $2, квартиры даже аренда уже выше, а покупка не менее миллиона, но все равно, примерно расклад можно узнать. Вообще по канаде информацию можешь еще здесь смотреть www.besed.ca

  • @vd3598
    @vd3598 3 роки тому +1

    Михаил, расскажите, пожалуйста, подробнее про DI. А именно, почему Вы используете для дата и бизнес сервисов singleton lifetime? Для меня вот сейчас это дилемма, поскольку мой предыдущий лид настаивал на transient или scoped by default, а нынешний настаивает на singleton by default. И в целом у обоих были на это свои аргументы. Сори, если уже было где то)

    • @Dev-lessons
      @Dev-lessons  3 роки тому +1

      Тут зависит от того, как работает класс. Если у класса нет состояния, как в моем случае, он может быть синглтоном - один единственный вариант класса будет использоваться на все запросы. Если у класса есть состояние, например у класса есть свойство CreditCard с номером кредитной карты текущего польозвателя. Такое просто запрещено использовать как синглтон, должен быть какой-то скоп - например текущий запрос, который станет границей для данных в состоянии. Как только пришел новый запрос, создается новый объект.

  • @andrewdirrell7497
    @andrewdirrell7497 3 роки тому +1

    Я слышал, что на собеседованиях в FAANG (и не только, конечно), задают вопросы по архитектуре. Не могли бы вы осветить эту тему?

    • @Dev-lessons
      @Dev-lessons  3 роки тому

      Я в FAANGах не работал, поэтому не знаю

  • @yava43
    @yava43 Рік тому

    зачем сервисы добавляем как Singletone? для подобных сервисов используется Transient

    • @Dev-lessons
      @Dev-lessons  Рік тому

      Почему для подобных сервисов используется именно Transient? почему не Scoped или Singletone?

    • @yava43
      @yava43 Рік тому

      лишнее место в памяти занимает. transient создает объект только когда это необходимо@@Dev-lessons

    • @Dev-lessons
      @Dev-lessons  Рік тому

      Причём при каждом обращении, а в нагруженной системе ты представляешь сколько раз будет инициализироваться объект и уничтожаться? При 1000 запросах в секунду минимум 1000 выделений и освобождений, а у меня один раз будет создан класс и сборщик мусора будет сидеть и кайфовать.

  • @EoLienFive
    @EoLienFive Рік тому

    А есть ли у вас пример разбиения архитектуры не на папки, а на отдельные проекты как class library?

    • @Dev-lessons
      @Dev-lessons  Рік тому

      Именно видео такого нет, но не вижу проблем папки перенести в отдельные проекты. На бусти у меня много практики

  • @baxram97
    @baxram97 2 роки тому

    А почему не используете EF Core?

    • @Dev-lessons
      @Dev-lessons  2 роки тому

      Очень подробно рассказал здесь
      ua-cam.com/video/-rk8YkTBZcs/v-deo.html
      Если коротко, я люблю сам писать SQL, чтобы контролировать его, а не надеется на то, что будет сгенерировано. Как видишь по видео, мне не сложно написать SQL.

  • @StarininAndrey
    @StarininAndrey 3 роки тому +2

    Буду студентам рекомендовать к просмотру. Чтобы видели, что не я один похожие вещи им пытаюсь объяснить.

  • @maflend2762
    @maflend2762 3 роки тому +2

    Классно круто, я так понимаю dal модели это аналоги dto моделей? Или это две разные истории😊

    • @Dev-lessons
      @Dev-lessons  3 роки тому

      Саязанные. DAL- Data Access Layer, или уровень доступа к даным. DTO - Data Transfer Objects - модели. DAL - это код доступа к данным, а DTO - это User класс - модель, в которой хранятся данные, которые передаются от базы в DAL, а потом в BL

  • @Денис-д1у2д
    @Денис-д1у2д 3 роки тому +1

    Михаил, что-то мне подсказывает, что ты не так свои приложения пишешь. Ты можешь показать какой-нибудь пример того как ты на самом деле пишешь?

    • @Dev-lessons
      @Dev-lessons  3 роки тому

      А есть «правильно» и «неправильно»? А я думал, что есть различные подходы и кто-то выбирает один подход, а кто-то другой.

    • @Денис-д1у2д
      @Денис-д1у2д 3 роки тому

      @@Dev-lessons Михаил, ну про «правильно» или «неправильно» я ничего не говорил)) А то, что есть различные подходы и кто-то выбирает один подход, а кто-то другой - это совершенно верно. Так о том-то и речь, что подход который ты показал в примере, то я сильно сомневаюсь что ты его выбираешь. Ты показал пример того, что ты встречал в других компаниях, а мне хочется увидеть твой) Я рос на твоих книгах "Библия Delphi" и "Библия C# и сейчас хочу расти дальше, но уже больше в архитектуре.

    • @Dev-lessons
      @Dev-lessons  3 роки тому +1

      @@Денис-д1у2д Я видел кто-то писал про правильно и отвечал на тот комментарий, но видимо попал под твой случайно. Как я пишу - зависит от ситуации. Но в слоеной архитектуре я чуть по другому делаю и обязательно запишу видео.

    • @Денис-д1у2д
      @Денис-д1у2д 3 роки тому

      @@Dev-lessons Михаил, ты лучший!!!

  • @Денис-д1у2д
    @Денис-д1у2д 3 роки тому +1

    Михаил, так ты вместо IUserRepository используешь IUserDAL. А ты говорил что не любишь эти репозитории, но далеко не ушёл.

    • @Dev-lessons
      @Dev-lessons  3 роки тому

      То, что IUserDAL используется в BL, это не делает его репозиторием, он не является им и работает по другому

    • @vd3598
      @vd3598 3 роки тому

      @@Dev-lessons Михаил, а можно Вас попросить, более подробно рассказать, в чем разница между DAL и Repository, о которой вы говорите? Просто я в работе с DAL не сталкивался, и то, что мы делаем с репозиториями как по мне идеологически похоже на то, что Вы показали в видео.

    • @Dev-lessons
      @Dev-lessons  3 роки тому +1

      @@vd3598 Разный подход к реализации DAL. Репозиторий может выполнять функции DAL и когда он работает как DAL, мне не нравится это.
      Тут все вопрос в том, как реализовывать DAL, в виде функций для доступа к данным или в виде репозитория.

    • @ЕвгенийАвдеев-и6п
      @ЕвгенийАвдеев-и6п 2 роки тому

      @@vd3598 Репозиторий , это штука выполняющая роль провайдера "собранных" данных.
      Т.е. в случае с DAL мы бы потянули просто данные из таблицы как есть. И в случае когда есть FK в такой таблице, никакими Join бы не занимались.
      Репозиторий, в зависимости от логики, зачастую отдал бы "нормальные" данные, сджойнив их как надо.
      Ну а путаница потому, что в реляционных БД все забивают на NF, и делают как есть. В итоге данные и представление данных смешивается в 1 таблице. И получается что репозиторий начинает выполнять роль DAL

  • @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 приложении делать, тогда приложению будет все равно, на каком стандарте написан бакенд

  • @musamusa1438
    @musamusa1438 3 роки тому

    спасибо, классно!!!

  • @fentan6806
    @fentan6806 2 роки тому

    Почему ты в Канаде программистом имеешь слабый пк?

    • @Dev-lessons
      @Dev-lessons  2 роки тому

      Это Windows ноут, который мне мощный не нужен, у меня есть mac на m2 для основных задач. Но если ты считаешь, что в Канаде у всех только крутые компьютеры, то ты наверно не живешь в Канаде, потому что такого стериотипа не было бы. Про зарплаты программистов я рассказывал на основном канале ua-cam.com/video/_CFeRe-kKYA/v-deo.html

    • @fentan6806
      @fentan6806 2 роки тому

      @@Dev-lessons а ну лан

  • @mechanism-o4h
    @mechanism-o4h 2 роки тому

    Ну не сказал бы, что модель написать 5 секунд. У нас больше двух сотен моделей и в каждой в среднем по 40 полей, а бывает и до сотни. Я уж молчу про то, что там есть связи с модели на модель, т.е. джойны между таблицами, к которым потом можно обращаться, например, через .include в LINQ. Производительность, конечно, хорошо, но как по мне такое себе удовольствие все это руками делать. Особенно, если все это дело внедряется не на проект с нуля, а на уже давно существующий. Тут EF Core очень помогает. Тем более постоянно создаются новые поля в моделях и все это контролировать на валидность вручную не так просто, мне кажется.
    Надеюсь, что мысль донес верно.
    А так спасибо за видео! Было интересно.
    P.S. Правильно я понял, что SQL-запросы при работе с Dapper никак не проверяются на работоспособность при написании?

    • @Dev-lessons
      @Dev-lessons  2 роки тому

      Ну так используй генератор, напиши свой. Его написать можно за час. SQL конечно не проверяется, это же текст

    • @ЕвгенийАвдеев-и6п
      @ЕвгенийАвдеев-и6п 2 роки тому +1

      40 полей в модели?
      Так получается в табличке почти столько же?
      Что ж там храните?

  • @IgorGallemar
    @IgorGallemar 3 роки тому +1

    Первый!!!

    • @Dev-lessons
      @Dev-lessons  3 роки тому +2

      Судя по админке Сергей первый.

    • @IgorGallemar
      @IgorGallemar 3 роки тому

      @@Dev-lessons странно, но времени у нас разрыв в минуту ☝️

  • @yava43
    @yava43 Рік тому

    это была попытка реализовать паттерн репозиторий? ниче не понимаю.........

    • @Dev-lessons
      @Dev-lessons  Рік тому

      просто слойная архитектура, репозитория тут нет

  • @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  Рік тому +1

      @@borisgarin8311 В Dapper есть два варианта - создать модель, которая будет состоять из всех колонок всего запроса - нужно если связанные таблицы возвращают небольшие данные. Второй - самому замапить данные в Products.Manufacturer.Category. Ручной вариант может быть - выполнить три запроса и замапить. Тут зависит от ситуации.

    • @borisgarin8311
      @borisgarin8311 Рік тому

      @@Dev-lessons Спасибо.

  • @Сергей-г4о3н
    @Сергей-г4о3н 3 роки тому +2

    Первый?)