Думал что-то у меня со звуком в некоторых моментах (Хром обновился, беспроводные уши тупят), но вроде это просто Михаил сам себя ускоряет в нек-рых моментах, создавая робовойс)) Пасиб за видео) как всегда - класс
У нас на работе юзают CQRS паттерн, с точки зрения написания кода и отлова ошибок - ОЧЕНЬ удобно. Но негативно влияет на производительность. Если не боритесь за доли секунды в запросах, то есть смысл юзать на больших проектах.
@@mechanism-o4h был хайп в одно время что медиатр медленный и что он на порядок или даже несколько хуже обычного вызова. Это верно, но речь идет здесь даже не за доли секунды а за милисекунды поэтому лучше сосредоточиться на читаемости кода. Предполагаю вам никогда в рамках оптимизации не придется заменять MediatR чем либо.
А нужно ли в работе с Даппер создавать модельки и ДТОшки отдельно между слоями и маппить их друг с другом или лучше просто с теми же моделями работать по всему проекту? На EF core мы разделяем между internal models и external models, но с даппером все эти модельки они и есть ДТО и часто приходится создавать новую модель если вдруг мне нужны доп. данные с других таблиц, а если создавать еще под каждую модель ДТО то это просто дублировать код, интересно будет услышать.
Здраствуйте! Я знаю что вопрос немного не по теме, но, на какую примерно уровень з\п может расчитывать .NET Middle программист с 3+ годами работы? Напрмер в той компании в которой Вы сейчас работаете или вообще по Вашей провинции
@@Dev-lessons Спасибо! Ещё на приехал пока, но из за войны в Украине и упрощенной иммиграции для украинцев планирую это делать. Это я так понимаю з\п в CAD?
@@shakotkopavlo Да, это канадский доллар. Про расходы в Канаде можешь узнать здесь ua-cam.com/video/ZZYHiPwovbU/v-deo.html цены за последнее время выросли немного, сейчас инфляция в Канаде достигает 6% официально, бензин уже $2, квартиры даже аренда уже выше, а покупка не менее миллиона, но все равно, примерно расклад можно узнать. Вообще по канаде информацию можешь еще здесь смотреть www.besed.ca
Михаил, расскажите, пожалуйста, подробнее про DI. А именно, почему Вы используете для дата и бизнес сервисов singleton lifetime? Для меня вот сейчас это дилемма, поскольку мой предыдущий лид настаивал на transient или scoped by default, а нынешний настаивает на singleton by default. И в целом у обоих были на это свои аргументы. Сори, если уже было где то)
Тут зависит от того, как работает класс. Если у класса нет состояния, как в моем случае, он может быть синглтоном - один единственный вариант класса будет использоваться на все запросы. Если у класса есть состояние, например у класса есть свойство CreditCard с номером кредитной карты текущего польозвателя. Такое просто запрещено использовать как синглтон, должен быть какой-то скоп - например текущий запрос, который станет границей для данных в состоянии. Как только пришел новый запрос, создается новый объект.
Причём при каждом обращении, а в нагруженной системе ты представляешь сколько раз будет инициализироваться объект и уничтожаться? При 1000 запросах в секунду минимум 1000 выделений и освобождений, а у меня один раз будет создан класс и сборщик мусора будет сидеть и кайфовать.
Очень подробно рассказал здесь ua-cam.com/video/-rk8YkTBZcs/v-deo.html Если коротко, я люблю сам писать SQL, чтобы контролировать его, а не надеется на то, что будет сгенерировано. Как видишь по видео, мне не сложно написать SQL.
Саязанные. DAL- Data Access Layer, или уровень доступа к даным. DTO - Data Transfer Objects - модели. DAL - это код доступа к данным, а DTO - это User класс - модель, в которой хранятся данные, которые передаются от базы в DAL, а потом в BL
@@Dev-lessons Михаил, ну про «правильно» или «неправильно» я ничего не говорил)) А то, что есть различные подходы и кто-то выбирает один подход, а кто-то другой - это совершенно верно. Так о том-то и речь, что подход который ты показал в примере, то я сильно сомневаюсь что ты его выбираешь. Ты показал пример того, что ты встречал в других компаниях, а мне хочется увидеть твой) Я рос на твоих книгах "Библия Delphi" и "Библия C# и сейчас хочу расти дальше, но уже больше в архитектуре.
@@Денис-д1у2д Я видел кто-то писал про правильно и отвечал на тот комментарий, но видимо попал под твой случайно. Как я пишу - зависит от ситуации. Но в слоеной архитектуре я чуть по другому делаю и обязательно запишу видео.
@@Dev-lessons Михаил, а можно Вас попросить, более подробно рассказать, в чем разница между DAL и Repository, о которой вы говорите? Просто я в работе с DAL не сталкивался, и то, что мы делаем с репозиториями как по мне идеологически похоже на то, что Вы показали в видео.
@@vd3598 Разный подход к реализации DAL. Репозиторий может выполнять функции DAL и когда он работает как DAL, мне не нравится это. Тут все вопрос в том, как реализовывать DAL, в виде функций для доступа к данным или в виде репозитория.
@@vd3598 Репозиторий , это штука выполняющая роль провайдера "собранных" данных. Т.е. в случае с DAL мы бы потянули просто данные из таблицы как есть. И в случае когда есть FK в такой таблице, никакими Join бы не занимались. Репозиторий, в зависимости от логики, зачастую отдал бы "нормальные" данные, сджойнив их как надо. Ну а путаница потому, что в реляционных БД все забивают на NF, и делают как есть. В итоге данные и представление данных смешивается в 1 таблице. И получается что репозиторий начинает выполнять роль DAL
Обычно когда говорят об 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 включительно), чтобы можно было использовать везде?
Это Windows ноут, который мне мощный не нужен, у меня есть mac на m2 для основных задач. Но если ты считаешь, что в Канаде у всех только крутые компьютеры, то ты наверно не живешь в Канаде, потому что такого стериотипа не было бы. Про зарплаты программистов я рассказывал на основном канале ua-cam.com/video/_CFeRe-kKYA/v-deo.html
Ну не сказал бы, что модель написать 5 секунд. У нас больше двух сотен моделей и в каждой в среднем по 40 полей, а бывает и до сотни. Я уж молчу про то, что там есть связи с модели на модель, т.е. джойны между таблицами, к которым потом можно обращаться, например, через .include в LINQ. Производительность, конечно, хорошо, но как по мне такое себе удовольствие все это руками делать. Особенно, если все это дело внедряется не на проект с нуля, а на уже давно существующий. Тут EF Core очень помогает. Тем более постоянно создаются новые поля в моделях и все это контролировать на валидность вручную не так просто, мне кажется. Надеюсь, что мысль донес верно. А так спасибо за видео! Было интересно. P.S. Правильно я понял, что SQL-запросы при работе с Dapper никак не проверяются на работоспособность при написании?
Здравствуйте. Как организовать сопоставление сущности на 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Спасибо. Я понял, как это сделать в SQL, но как возвести модель из результата такого запроса. Через spiltOn видел примеры только на 2 таблицы (один JOIN)? В EF подобное: _context.Products.Include(p=>p.Manufacturer).Include(p=>p.Category).ToList(); А в Dapper? Получить объект на основе JOIN-ов.
@@borisgarin8311 В Dapper есть два варианта - создать модель, которая будет состоять из всех колонок всего запроса - нужно если связанные таблицы возвращают небольшие данные. Второй - самому замапить данные в Products.Manufacturer.Category. Ручной вариант может быть - выполнить три запроса и замапить. Тут зависит от ситуации.
Хотим больше про архитектуру
Dapper выглядит просто божественно для мапинга данных
Думал что-то у меня со звуком в некоторых моментах (Хром обновился, беспроводные уши тупят), но вроде это просто Михаил сам себя ускоряет в нек-рых моментах, создавая робовойс)) Пасиб за видео) как всегда - класс
Да, я делал ускорения, чтобы ускорить моменты. в которых я просто печатал
Спасибо большое! Это поможет мне с проектом на моей новой работе!
В Канаде?
@@Dev-lessons в России. До Канады пока не вырос профессионально
Даппер это прекрасно -)
Круть с расширением Dapper так просто sql запосы переводить в модель, архитектура тоже интересная надо будет с новым проектом заюзать
А смысл в BL возвращать null при вызове Authenticate? Не лучше ли выкидывать исключения в случаях, если юзер не прошел аутентификацию?
конечно же в реальном приложении нужна хорошая ошибка, а не NULL
Спасибо за урок
Михаил, а что вы думаете про MediatR ? И вообще, нужно ил его применять, делая апи контроллеры максимально легковесными?
Для своих задач можно использовать.
У нас на работе юзают CQRS паттерн, с точки зрения написания кода и отлова ошибок - ОЧЕНЬ удобно. Но негативно влияет на производительность. Если не боритесь за доли секунды в запросах, то есть смысл юзать на больших проектах.
@@mechanism-o4h был хайп в одно время что медиатр медленный и что он на порядок или даже несколько хуже обычного вызова. Это верно, но речь идет здесь даже не за доли секунды а за милисекунды поэтому лучше сосредоточиться на читаемости кода. Предполагаю вам никогда в рамках оптимизации не придется заменять MediatR чем либо.
А нужно ли в работе с Даппер создавать модельки и ДТОшки отдельно между слоями и маппить их друг с другом или лучше просто с теми же моделями работать по всему проекту?
На EF core мы разделяем между internal models и external models, но с даппером все эти модельки они и есть ДТО и часто приходится создавать новую модель если вдруг мне нужны доп. данные с других таблиц, а если создавать еще под каждую модель ДТО то это просто дублировать код, интересно будет услышать.
Можно, но нужно понимать, что это будет нагрузка на сборщик мусора, потому что все эти модели будут жить недолго.
Спасибо. Мне было полезно и интересно. Только осваиваю.
Здраствуйте! Я знаю что вопрос немного не по теме, но, на какую примерно уровень з\п может расчитывать .NET Middle программист с 3+ годами работы? Напрмер в той компании в которой Вы сейчас работаете или вообще по Вашей провинции
Если ты ты только приехал в Канаду, то тебе можно пробоваться на мидла и это 100к в год.
@@Dev-lessons Спасибо! Ещё на приехал пока, но из за войны в Украине и упрощенной иммиграции для украинцев планирую это делать. Это я так понимаю з\п в CAD?
@@shakotkopavlo Да, это канадский доллар. Про расходы в Канаде можешь узнать здесь ua-cam.com/video/ZZYHiPwovbU/v-deo.html цены за последнее время выросли немного, сейчас инфляция в Канаде достигает 6% официально, бензин уже $2, квартиры даже аренда уже выше, а покупка не менее миллиона, но все равно, примерно расклад можно узнать. Вообще по канаде информацию можешь еще здесь смотреть www.besed.ca
Михаил, расскажите, пожалуйста, подробнее про DI. А именно, почему Вы используете для дата и бизнес сервисов singleton lifetime? Для меня вот сейчас это дилемма, поскольку мой предыдущий лид настаивал на transient или scoped by default, а нынешний настаивает на singleton by default. И в целом у обоих были на это свои аргументы. Сори, если уже было где то)
Тут зависит от того, как работает класс. Если у класса нет состояния, как в моем случае, он может быть синглтоном - один единственный вариант класса будет использоваться на все запросы. Если у класса есть состояние, например у класса есть свойство CreditCard с номером кредитной карты текущего польозвателя. Такое просто запрещено использовать как синглтон, должен быть какой-то скоп - например текущий запрос, который станет границей для данных в состоянии. Как только пришел новый запрос, создается новый объект.
Я слышал, что на собеседованиях в FAANG (и не только, конечно), задают вопросы по архитектуре. Не могли бы вы осветить эту тему?
Я в FAANGах не работал, поэтому не знаю
зачем сервисы добавляем как Singletone? для подобных сервисов используется Transient
Почему для подобных сервисов используется именно Transient? почему не Scoped или Singletone?
лишнее место в памяти занимает. transient создает объект только когда это необходимо@@Dev-lessons
Причём при каждом обращении, а в нагруженной системе ты представляешь сколько раз будет инициализироваться объект и уничтожаться? При 1000 запросах в секунду минимум 1000 выделений и освобождений, а у меня один раз будет создан класс и сборщик мусора будет сидеть и кайфовать.
А есть ли у вас пример разбиения архитектуры не на папки, а на отдельные проекты как class library?
Именно видео такого нет, но не вижу проблем папки перенести в отдельные проекты. На бусти у меня много практики
А почему не используете EF Core?
Очень подробно рассказал здесь
ua-cam.com/video/-rk8YkTBZcs/v-deo.html
Если коротко, я люблю сам писать SQL, чтобы контролировать его, а не надеется на то, что будет сгенерировано. Как видишь по видео, мне не сложно написать SQL.
Буду студентам рекомендовать к просмотру. Чтобы видели, что не я один похожие вещи им пытаюсь объяснить.
Классно круто, я так понимаю dal модели это аналоги dto моделей? Или это две разные истории😊
Саязанные. DAL- Data Access Layer, или уровень доступа к даным. DTO - Data Transfer Objects - модели. DAL - это код доступа к данным, а DTO - это User класс - модель, в которой хранятся данные, которые передаются от базы в DAL, а потом в BL
Михаил, что-то мне подсказывает, что ты не так свои приложения пишешь. Ты можешь показать какой-нибудь пример того как ты на самом деле пишешь?
А есть «правильно» и «неправильно»? А я думал, что есть различные подходы и кто-то выбирает один подход, а кто-то другой.
@@Dev-lessons Михаил, ну про «правильно» или «неправильно» я ничего не говорил)) А то, что есть различные подходы и кто-то выбирает один подход, а кто-то другой - это совершенно верно. Так о том-то и речь, что подход который ты показал в примере, то я сильно сомневаюсь что ты его выбираешь. Ты показал пример того, что ты встречал в других компаниях, а мне хочется увидеть твой) Я рос на твоих книгах "Библия Delphi" и "Библия C# и сейчас хочу расти дальше, но уже больше в архитектуре.
@@Денис-д1у2д Я видел кто-то писал про правильно и отвечал на тот комментарий, но видимо попал под твой случайно. Как я пишу - зависит от ситуации. Но в слоеной архитектуре я чуть по другому делаю и обязательно запишу видео.
@@Dev-lessons Михаил, ты лучший!!!
Михаил, так ты вместо IUserRepository используешь IUserDAL. А ты говорил что не любишь эти репозитории, но далеко не ушёл.
То, что IUserDAL используется в BL, это не делает его репозиторием, он не является им и работает по другому
@@Dev-lessons Михаил, а можно Вас попросить, более подробно рассказать, в чем разница между DAL и Repository, о которой вы говорите? Просто я в работе с DAL не сталкивался, и то, что мы делаем с репозиториями как по мне идеологически похоже на то, что Вы показали в видео.
@@vd3598 Разный подход к реализации DAL. Репозиторий может выполнять функции DAL и когда он работает как DAL, мне не нравится это.
Тут все вопрос в том, как реализовывать DAL, в виде функций для доступа к данным или в виде репозитория.
@@vd3598 Репозиторий , это штука выполняющая роль провайдера "собранных" данных.
Т.е. в случае с DAL мы бы потянули просто данные из таблицы как есть. И в случае когда есть FK в такой таблице, никакими Join бы не занимались.
Репозиторий, в зависимости от логики, зачастую отдал бы "нормальные" данные, сджойнив их как надо.
Ну а путаница потому, что в реляционных БД все забивают на NF, и делают как есть. В итоге данные и представление данных смешивается в 1 таблице. И получается что репозиторий начинает выполнять роль DAL
Обычно когда говорят об 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 включительно), чтобы можно было использовать везде?
REST API в Web приложении делать, тогда приложению будет все равно, на каком стандарте написан бакенд
спасибо, классно!!!
Почему ты в Канаде программистом имеешь слабый пк?
Это Windows ноут, который мне мощный не нужен, у меня есть mac на m2 для основных задач. Но если ты считаешь, что в Канаде у всех только крутые компьютеры, то ты наверно не живешь в Канаде, потому что такого стериотипа не было бы. Про зарплаты программистов я рассказывал на основном канале ua-cam.com/video/_CFeRe-kKYA/v-deo.html
@@Dev-lessons а ну лан
Ну не сказал бы, что модель написать 5 секунд. У нас больше двух сотен моделей и в каждой в среднем по 40 полей, а бывает и до сотни. Я уж молчу про то, что там есть связи с модели на модель, т.е. джойны между таблицами, к которым потом можно обращаться, например, через .include в LINQ. Производительность, конечно, хорошо, но как по мне такое себе удовольствие все это руками делать. Особенно, если все это дело внедряется не на проект с нуля, а на уже давно существующий. Тут EF Core очень помогает. Тем более постоянно создаются новые поля в моделях и все это контролировать на валидность вручную не так просто, мне кажется.
Надеюсь, что мысль донес верно.
А так спасибо за видео! Было интересно.
P.S. Правильно я понял, что SQL-запросы при работе с Dapper никак не проверяются на работоспособность при написании?
Ну так используй генератор, напиши свой. Его написать можно за час. SQL конечно не проверяется, это же текст
40 полей в модели?
Так получается в табличке почти столько же?
Что ж там храните?
Первый!!!
Судя по админке Сергей первый.
@@Dev-lessons странно, но времени у нас разрыв в минуту ☝️
это была попытка реализовать паттерн репозиторий? ниче не понимаю.........
просто слойная архитектура, репозитория тут нет
Здравствуйте. Как организовать сопоставление сущности на 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.
Вижу два inner, визуально даже выглядит верно. Точно также сделай два left
@@Dev-lessonsСпасибо. Я понял, как это сделать в SQL, но как возвести модель из результата такого запроса. Через spiltOn видел примеры только на 2 таблицы (один JOIN)?
В EF подобное: _context.Products.Include(p=>p.Manufacturer).Include(p=>p.Category).ToList();
А в Dapper?
Получить объект на основе JOIN-ов.
@@borisgarin8311 В Dapper есть два варианта - создать модель, которая будет состоять из всех колонок всего запроса - нужно если связанные таблицы возвращают небольшие данные. Второй - самому замапить данные в Products.Manufacturer.Category. Ручной вариант может быть - выполнить три запроса и замапить. Тут зависит от ситуации.
@@Dev-lessons Спасибо.
Первый?)