CRUD веб приложение на ASP.NET Core, React, EF Core, Postgresql с чистой архитектурой
ฝัง
- เผยแพร่เมื่อ 15 มิ.ย. 2024
- В этом видео я покажу как сделать просто фуллстак crud веб приложение на asp net core + react (next.js).
✅ Подписаться на Telegram: t.me/sachkov_blog
✅ Поддержать денежкой: boosty.to/sachkov/donate
00:00 Введение
01:00 Слой с domain моделями
07:00 Слой с базой данных
10:30 Конфигурация модели в бд
13:00 Добавление репозитория
24:00 Класс Program
27:00 Docker контейнер с postgresql
29:00 Слой с бизнес логикой
34:50 Контроллеры
48:00 Фронтенд
1:34:00 Показываю результат
В итоге мало чего объяснил и подача оставляет желать лучшего. В следующих видео постараюсь сделать качественнее, а это можете смело ставить на 2х. Мой телеграм канал - t.me/sachkov_blog
Спасибо за труд. Наоборот, всё очень понятно и доходчиво) Очень полезно и всё доходчиво. Я бэкендер
@@user-eo9my7or6n Спасибо!
Всё замечательно. Понятно что дальше лучше. Самое главное не опускай руки, так как по .NET очень мало свежих видео и я очень рад что нашёл твой канал так как он очень сильно помог мне в понимание мелких деталей .NET. Спасибо большое)))
продолжай, все учатся на ошибках - главное их замечать и признавать.
Смотрел на 1х не отрываясь
Шикарно, большое спасибо!
Наконец-то кто-то приводит пример, приближенный к реальной разработке
Кирилл огромное тебе спасибо!!! Давно хотел фронт пощупать, ты вдохновил)
Опа, это я удачно зашел. Хорошо объясняешь, продолжай в том же духе.
Спасибо большое! Очень познавательное видео.
Хоть видео и длинное, но посмотрел на одном дыхании, стал больше понимать, как работает приложение в целом, спасибо
Спасибо!
Забавный момент который я не сразу заметил. Тут создается контейнер в Докере и запускается но используется при этом обычный сервер Postgresql если я правильно понял. То есть в данном случаи создание контейнера используется как создание БД схемы а работа с БД ведется напрямую через локальный установленный скорее всего сервер Postgresql, а не в докера , ибо если остановить работу контейнера, то о чудо, работа апи не будет выбрасывать ошибки, что докажет что апи работает с сервером. Но видео при этом очень полезное и достаточно хорошо показывает БАЗУ!)
Я фронтендер, появилось больше понимания, как работает бэкенд. Спасибо за видео!)
Спасибо!
Thanks a million for your video it's a good lesson for me. i made api and I will be doing next super Welldone!!!
@KirillDeveloper видео понравилось, но пример уж слишком простой в данном случае. Мне кажется стоило добавить еще несколько связанных между собой сущностей, чтобы показать как реализовать эту связь в моделях и репозиториях, например как в видео по EF. В любом случае благодарю за видео, продолжай!
Очень интересный видос.
Многое непонятно, но это даже здорово, т.к. захотелось углубиться и погуглить отдельно некоторые моменты.
Я далек от фронта, но тоже было интересно, хотелось с чего-то начать. Почему бы не начать с того, что предлагает автор.
Думаю, что пересмотрю видео ещё раз. Спасибо 😊
Gоod !!! больше нечего и не нужно говорить! спасибо за ваш труд!
Спасибо за видео!
Спасибо, то что нужно.
Добрый день!Спасибо за материал!А есть ссылка на гит с кодом?
Спасибо, очень познавательно. Есть вопрос: чем плох шаблон "React and ASP.NET Core"? Его используют на практике, или все же обычно используют разделение frontend/backend как в ролике? Спасибо.
Большинство разделяют проекты, чтобы все деплоилось независимо + в шаблоне используется сборщик vite, кому-то может не нравится. Просто если создашь отдельно фронт, то можно вести себя гибче, менять сборщики и тд, поэтому рекомендую делать раздельно
Привет. Не мог бы ты пояснить момент.
Не понятен смысл существования BookEntity.
Действительно ли нам нужно, используя EF codefirst и миграции, юзать эту прослойку? Какие проблемы мы этим решаем? В твоем примере получается просто валидация при чтении из БД, зачем оно надо не понятно.
За труды Спасибо, это самый лучший мануал по теме, который мне удалось найти.
spasibo!
Молодец 👍
почему валидацию не делать через аттрибут required ???
То чувство когда выучил базовый синтаксис и понимаешь, что дальше уже ничего не понимаешь
Есть исходный код в доступе?
Это я удачно залетел. Давно хотел пощупать React за мяхкое место. С меня лайк и подписка. Так држать.
И сразу вопрос. Можно ли добавть итолько страницу на реакте. В Существующие mvc приложение net core 6. Например реализовать админку и странице статистики по каким нибуть item"s?
Спасибо! По идее можно, есть интеграции react в asp net mvc, есть nuget библиотеки для этого, после установки можно будет использовать файлы jsx.
@@KirillSachkov Вот и готовая идея для реализации любителей нестандртного програмирования ))
Странно я все делаю как на видео но у меня выдаёт ошибку в Programs.cs а именно в IBooksService и IBooksService он не видит их хоть я ссылку даю.
Как ты в Visual Studio сделал внешний вид, наподобие внешнего вида vs code?
Это preview версия
[15:55] Вызов Select после ToListAsync? надо до превращения в лист мэпить. запрос в бд будет чаще всего короче и не придется после создания листа итерироваться по новой
в примечании microsoft рекомендует использовать Add, кроме некоторых исключительных случаев
Кирилл, есть возможность предоставить гитхаб с этим проектом?
Позже в телеграм канале выложу
Есть ли смысл использовать шаблон c реактом в VS, там где сборщик vite?
Ещё не использовал vite, но как минимум для изучения, смысл есть
Сделай еще одно такое видео просто создай полноценный проект и сразу на видео покажи как в нитернет опубликовать проект
В некоторых случаях dto же находится на уровне бизнес логики , то есть логика возвращает нужный объект для контроллера , а контроллер просто возвращает , то есть в контроллере минимум логики. Такой вариант более правильнее ?
Зависит от подхода, но если это подход контролер, сервис, репозиторий, то сервис должен возвращать Domain модель, а контроллер маппить её в дто
Интересный подход. И всё же есть вопрос. Класс Book, тот , который домейновский, он не противоречит SOLID? Возможно, я что-то не понимаю, но здесь при создании класса у нас одновременно и состояния, и поведение и даже инициализация экземпляра этого же класса, как в Singletone, и там же - валидация. Такое ощущение, как будто мы перегружаем класс. А он является домейновским. Поправьте, если не прав. А вообще объяснение мне очень даже понравилось. Спасибо за труды. Теперь буду следить за вами. Лайк и респект за обучение
я также считаю, че то много всего происходит в одном классе
Привет,на 1:50 про какую логику идет речь, это же просто модели,не ?
Про доменную логику, у моделей может быть большая логика, например модель банкомата
А вот ты создаешь в book.cs метод create и проверяешь title , но даже если у нас будет ошибка в любом случае сожается book ? Если я все правильно понял
Правильнее было бы, сделать возвращаемый тип Book?, и если ошибка есть, то возвращать вместо book - null. А ещё правильнее использовать тип Result, как я делаю в видео про богатую DDD модель
@@KirillSachkov, честно, не совсем понял прикол такой реализации. Даже если возвращать null, то где-то на уровень выше прийдётся каждый раз проверять, что нам вернул метод, а если где-то забыть это сделать, то все приложение сломается. Сомнительная практика. Разве не лучше просто выбрасывать исключения?
@@LightChimera Можно просто выбрасывать исключение, но это менее производительно. Тут кому как больше нравится, либо использовать тип Result и делать проверку каждый раз при создании модели или выбрасывать исключение, но жертвовать производительностью
@@KirillSachkovТеперь понял мотив, спасибо
@@KirillSachkov out of the blue. возвращать null? rly? это худшее зло, что коллекции, что поодиночные объекты
вроде так не плохо все сделал и более или менее понимаешь суть, но иногда у тебя такие высказывания проскакивают, что не имеют никакого отношения к clean code, architecture.
12:38 А разве использование константы из Core слоя в Data слое не нарушает принцип обратной зависимости? Не лучше ли будет вынести константу в отдельный конфигурационный файл (например appsettings.json), где будут храниться все константы?
А еще лучше в EnvironmentVariable в файле launchSettings.json
Нет, не нарушает, слой Persistence имеет доступ к доменным моделям, как минимум он их возвращает и принимает в репозиториях, поэтому так можно делать. Конечно желательно, чтобы слой Persistence ссылался на Application, а Application на Domain
В конфиге константы хранить не лучшая идея
У меня постоянно лажа с зависимостями между слоями, а есть больше информации про это? То слой DAL не видит Core то В контроллерах не видно модели или интерфейсы из Core. Как их правильно настраивать, когда несколько проектов в солюшене?
Будет про это видео
Привет, пару небольших замечаний:
1) Там где const string MAX_TITLE_LENGTH, лучше было его же и вписать в error, вместо магичской 250
2) Вместо кортежа result + error как будто бы напрашивается отдельный класс (Пример у Чапсаса - th-cam.com/video/YbuSuSpzee4/w-d-xo.html)
Согласен, но решил не усложнять пример и показать саму концепцию, а с переменной, просто забыл так сделать)
про 2 - 100% надо result класс
Как сделать вижуалку такой же красивой?
Превью версия
Пока фронт не начал показывать, всё понятно было и без вопросов (за исключением пары моментов),
Как только начался фронт... Я перестал улавливать логику...
Что за иерархия папок, что за компоненты, несколько файлов с book и т.д.😅
Ощущение, что ты спешил очень куда-то 😅
Признаюсь, так и было, с фронтом я в этом видео накосячил, буду теперь разбивать на части такие видео и про фронт отдельно разговаривать)
@@KirillSachkov буду ждать
даа, есть такое. наконец-то закончил делать, но использовал сборщик Vite, чисто из-за привычки (все 1 в один, только роутинг иначе реализовал)
поначалу все еще понятно было, но под конец куча файлов, стейтов и все перемешалось в голове короче😓
+либо я пропустил, либо реализация кнопки Add Books появилась магическим образом в конце видео))
+ у меня почему-то каждая карточка занимает целую строку, но с этим уже разберусь.
А так классный урок, определенно, есть чему поучиться. Спасибо огромное
i done everything is it ok asp + next good mix
А как docker-compose up -d без докерфайла работает?
Он загружает образы(images), если запускаешь свое приложение, то сначала нужно сделать для него докер файл
@@KirillSachkov Тоесть если тебе нужен постгре то достаточно докер-композ, но если хочешь в докер контейнер положить свое приложение, тогда нужен докерфайл. Понял. Спасибо.
Да, и ты можешь из своего приложения сделать образ, загрузить его в докер хаб и потом оттуда загружать образ, также, как и с постгрес например
Скинь пожалуйста тему оформления в VS
Это Dracula в visual studio и dracula purple в vs code
в повершеле прописывал миграцию и само окно частично скрыл и не понятно, что там прописывал(
dotnet ef migrations add название миграции -p путь до проекта с dbcontext -s путь до проекта с api. В документации эта команда есть, можно загуглить dotnet ef migrations
@@KirillSachkovспасибо за объяснение!
Мой опыт и здравый смысл говорит, что в данном типе приложений, где по сути только CRUD, использование репозиториев бессмысленно.
Какая тема на вс?
Dracula на vs, dracula purple на vs code
@@KirillSachkov спасибо
а что за язык?
C#
Каким образом можно всему этому научиться? 😭
Да это еще только база) Ну а вообще усердными занятиями)
гайд слабый, хоть и понятно, что хотел донести автор, но всё-таки хотелось бы знать, почему так или не так сделано в каком-то конкретном случае(именно ход мыслей и логическое рассуждение, подкрепленнённые фактами из реальной разработки), понимаю, первое видео - проба пера, и в будущем будет лучше, но на такие вещи сразу лучше обращать внимание
Крайне малоинфлрмативный видос, объясняешь почти ничего.
Для новичков плохо объяснил, а профессионал будет скучно такое.