Создание ASP NET Core Web API приложения

  Рет қаралды 29,630

Platinum DEV

Platinum DEV

Күн бұрын

Пікірлер: 85
@TpyHaGuBaTop
@TpyHaGuBaTop 9 ай бұрын
Это видео интересно не для полных новичков, а для тех, кто уже умеет писать WebApi, но хочет научиться делать это, используя чистую архитектуру и best practices, которые можно встретить на реальных больших проектах. Лично для меня, работавшего 2 года с легаси и в глаза не видевшего clean architecture, этот плейлист действительно полезен и понятен. Такого контента не так уж много на ютубе. Автору большой респект
@PlatinumTechTalks
@PlatinumTechTalks 8 ай бұрын
спасибо большое за такой отзыв!)
@Бот5329-и5г
@Бот5329-и5г 2 жыл бұрын
А можете сделать урок по созданию API на обычной трехуровневой архитектуре. Ато этот пример очень конечно крутой, затрагивает много технологий но для новичка вроде меня очень сложен в понимании.
@antya1126
@antya1126 6 ай бұрын
Спасибо большое за курс
@ИльяИгоревич-й8е
@ИльяИгоревич-й8е Жыл бұрын
обожаю оверинженеринг) не вижу смысла в коммандах, запросах, если сервис прекрасно справляется
@IvanenkoStepan
@IvanenkoStepan 3 жыл бұрын
Спасибо🙏
@PlatinumTechTalks
@PlatinumTechTalks 3 жыл бұрын
Вам спасибо!!
@dimitrisinger868
@dimitrisinger868 10 ай бұрын
Это уже седьмое видео по счету и только сейчас автор запускает первый раз Веб-Апи. И только сейчас у меня выясняется что база данных не создается и есть еще другие ошибки. И где я ошибся придется долго искать. Не лучше было бы каждый шаг проверять, а не на седьмом видео. А еще лучше было бы автору выложить весь проект, чтобы можно было легче найти ошибку у себя. В любом случае спасибо автору за труд.
@PlatinumTechTalks
@PlatinumTechTalks 8 ай бұрын
под каждым видео в описании есть ссылка на коммит с тем состоянием кода, в котором он был к концу урока, это может помочь, спасибо за фидбек
@ДенисВикторович-л2о
@ДенисВикторович-л2о 2 жыл бұрын
Курс отличный. На данном этапе мы реализовали контролер, и необходимые методы: добавление, изменение, удаление, получение всего списка. Вот вопрос, а блоки try catch почти нигде не писали. Это нормально? вдруг будет ошибка например при добавлении записи, ошибка в базе данных, вот возникнет в классе class DeleteNoteCommandHandler. Получается лажет приложение? Я интересуюсь, потому что хочу знать, где в реальных приложения правильно использовать отлов ошибок. Абсолютно везде использовать блоки try catch не вариант. Использовать на самых высоких уровнях? например в контролерах???? Хотелось бы услышать ваш совет.
@Fikusiklol
@Fikusiklol Жыл бұрын
Зачем делать маппинг из класса для Request (CreateNoteCommand) в CreateNoteDTO? В API будет прилетать как раз DTO объект (или объект его содержащий), который можно записывать в свойство класса Request'a, а в Handle уже производить маппинг. Поправьте, если ошибаюсь, но вообще маппинг используется между DTO и оригинальным объектом.
@BraentR
@BraentR 3 жыл бұрын
Спасибо
@ИванСарычев-я4ж
@ИванСарычев-я4ж Жыл бұрын
13:18 минуте видео у нас неожиданно появляется база данных Platinum. Объясните как ее ввести
@ВикторБелянкин-м1щ
@ВикторБелянкин-м1щ Жыл бұрын
У меня кроме матов по этому поводу больше никаких эмоций нету, и так сложно, дак еще и файлы откуда-то появляются.
@murr_ka4374
@murr_ka4374 5 ай бұрын
@@ВикторБелянкин-м1щ Надо миграцию сделать, чтобы база появилась. А в видео этот момент почему-то опущен.
@qofi4922
@qofi4922 3 жыл бұрын
Подскажите пожалуйста, на какой уровень, согласно данной модели, необходимо выносить "сложную" логику запросов? Например, для выполнения запроса, мне необходимо сперва получить 2 разные сущности (для этого я делаю 2 разных query?), затем проверить их данные, и, при выполнении условий, создать сущность третьего типа (запрос command). На уровне Application или WebApi? Особенно, если подобные действия могут вызываться в разных контроллерах?
@june3878
@june3878 2 жыл бұрын
тут напрашивается прослойка в виде сервиса на уровне Application. Поправьте, если ошибаюсь
@Avin0f
@Avin0f Жыл бұрын
Подскажите, пожалуйста, а зачем мы прописываем роутинг контроллеру, если мы уже в base controller писали этот атрибут?
@ИванК-в3б
@ИванК-в3б 2 жыл бұрын
Спасибо за серию уроков, многие вещи для меня теперь стали более понятными, но при запуске проекта выдает ошибку HTTP Error 502.5 - Process Failure. Можете подсказать, в какую сторону копать, чтобы найти причину?
@Amir-xg4nn
@Amir-xg4nn Жыл бұрын
Проблема в Program.cs или Startup.cs. От версии asp net core зависит стоит ли использовать эти Startup
@june3878
@june3878 2 жыл бұрын
хм, получается нам не нужны ef dotnet tools?
@ohmygoodness4653
@ohmygoodness4653 2 жыл бұрын
Больше спасибо за этот замечательный урок! Но осталось лёгкое непонимание при работе с контроллером, в частности с getall. Мы отправляем команду в хандлер, который берет данные из дбконтекста. Почему же тогда мы не получаем ошибку от сервера, что ни таблица notes ни сама база данных не создана... Хотя запрос успешно выполняется (пусть и пустой список, ведь пустой список это все равно результат работы БАЗЫ ДАННЫХ)
@PlatinumTechTalks
@PlatinumTechTalks 2 жыл бұрын
спасибо! База создается при старте приложения когда вызывается EnsureCreated
@deniskozhukhar469
@deniskozhukhar469 Жыл бұрын
Подскажите, пожалуйста, при запросе api/note выдает ошибку в строке var vm = await Mediator.Send(query) - System.NullReferenceException: "Object reference not set to an instance of an object.", с чем это может быть связанно?
@ЯрославПроцик-г8я
@ЯрославПроцик-г8я Жыл бұрын
У меня такая же ошибка, ты как-то её исправил?
@VladimirRoschin
@VladimirRoschin Жыл бұрын
У меня очень странная ситуация: IMediator.Send(new GetNoteListQuery) возвращает Task, а IMediator.Send(new GetNoteDetailsQuery) возвращает Task (void). Cигнатуры хэндлеров следующие public async Task Handle(GetNoteDetailsQuery request, CancellationToken cancellationToken); public async Task Handle(GetNoteListQuery request, CancellationToken cancellationToken); и как это понимать? Почему он считает что при GetNoteDetailsQuery должен возвращаться void?? пишу на .net 6
@VladimirRoschin
@VladimirRoschin Жыл бұрын
Разобрался, унаследовал хэндлер сразу от IRequest и IRequest
@ВладимирПавлов-ф7б
@ВладимирПавлов-ф7б 2 жыл бұрын
Добрый день. У вас в методе Task Create(CreateNoteDto createNoteDto) - который создаёт запись, возвращается Ok(noteId). Соответственно StatusCodes будет 200. Но это же не совсем правильно. Мы же должны возвращать 201 через Created(). Тем более, что вы когда описание для сваггера делали, так и написали [ProducesResponseType(StatusCodes.Status201Created)]. Как исправить метод?
@PlatinumTechTalks
@PlatinumTechTalks 2 жыл бұрын
Здравствуйте. Видимо, опечатка. Нужно тогда return Created(noteId);
@ВладимирПавлов-ф7б
@ВладимирПавлов-ф7б 2 жыл бұрын
@@PlatinumTechTalks created требует два параметра. первый - урл. И вот какой урл подставить я не знаю. нам же вроде не надо никуда переходить... (извините за глупые вопросы)
@PlatinumTechTalks
@PlatinumTechTalks 2 жыл бұрын
В первый параметр можно передать просто ссылку на созданный объект. Например так “www.example.com/api/controller/id” где id это айди только что созданного объекта. Вероятно можно просто айди строкой без ссылки отдавать. Это то что клиенту вернется в заголовке ответа. Во втором параметре можно передать что угодно, можно айдишник, можно сам объект. В зависимости от нужд. Клиенту это вернется в теле ответа. (глупых вопросов не бывает)
@МарияСорокина-ъ3з
@МарияСорокина-ъ3з 2 жыл бұрын
Подскажите пожалуйста, при попытке сделать запрос в постмане, в таске getall() nullreference, медиатор = null. В чем может быть ошибка? Использую asp.net 6.
@PlatinumTechTalks
@PlatinumTechTalks 2 жыл бұрын
Он у вас инициализируется? Посмотрите BaseController и DependencyInjection в Application, поставьте точки останова и тд
@clutchmeisteryo9831
@clutchmeisteryo9831 2 жыл бұрын
Добрый день. Попробуйте следующее, в Notes.Application-> class DependencyInjection -> добавить: services.AddMediatR(Assembly.GetExecutingAssembly()); return services;
@NikolayShelakhaev
@NikolayShelakhaev 2 жыл бұрын
@@clutchmeisteryo9831 Спасибо!
@Emir-ry9yl
@Emir-ry9yl Жыл бұрын
@@clutchmeisteryo9831 лучший брат
@krahmaletskrakmalets7587
@krahmaletskrakmalets7587 2 жыл бұрын
Добрый день ! Подскажите, какие еще есть инструменты , кроме ПостМана, для проверки API?
@PlatinumTechTalks
@PlatinumTechTalks 2 жыл бұрын
Здравствуйте! Insomnia, Fiddler, Hoppscotch (aka PostWoman), консольная утилита httprepl.
@krahmaletskrakmalets7587
@krahmaletskrakmalets7587 2 жыл бұрын
@@PlatinumTechTalks спасибо)
@ValentinAntinicotine
@ValentinAntinicotine 3 жыл бұрын
Не знаю где я и что пропустил, но пересмотрел все на 5 раз, перепроверил также. Выдает ошибку в Postman: Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 1: 'no such table: Notes'. Как я понимаю не создается таблица, база данных есть, а таблицы внутри нет. Если сможете, подскажите пожалуйста в каком направлении копать.. Спасибо.
@Кирилл-ж3м2н
@Кирилл-ж3м2н 3 жыл бұрын
В DbInitializer метод Initialize. Или NotesDbContext, метод OnModelCreating
@ValentinAntinicotine
@ValentinAntinicotine 3 жыл бұрын
@@Кирилл-ж3м2н Спасибо за направление.
@mr.kirill9060
@mr.kirill9060 3 жыл бұрын
@@ValentinAntinicotine Нужно не забыть вызвать .Initialize(context) в Program.cs в блоке try :-)
@kpssnik9570
@kpssnik9570 2 жыл бұрын
Лучше поздно, чем никогда. Мне помогло следующее: Я на .NET 7 делал, уже минимал апи, нету файла Startup.cs В программе в try блоке строчка var context = serviceProvider.GetRequiredService(); вызывалась раньше, чем инжектился сервис дб контекста в метода расширение AddPersistence поэтому надо сначала делать builder.Services.AddPersistence, а только потом трай блок с получением сервиса контекста и db initialize
@olehdumanskyi7830
@olehdumanskyi7830 Жыл бұрын
@@kpssnik9570 Ты меня спас от пары часов утомительного дебага, спасибо) UPD: а, нет, похоже не спас, в EnsureCreated программа заходит, но не похоже, чтобы где-то создавался файл бд, и ошибка остается, может есть мысли по поводу?) UPD2: разобрался, напишу решение, вдруг кому поможет: //получаем конфигурацию в файле program.cs ConfigurationManager configuration = builder.Configuration; //явно указываем путь к файлам builder.Environment.ContentRootPath = Assembly.GetEntryAssembly().Location; Проблема заключалась в том, что DependencyInjection.cs не мог распарсить appsettings.json, потому что не мог его найти, соответственно мы получали пустой connection string и база данных не создавалась, хотя ensure created возвращал true.
@kokoshko1985
@kokoshko1985 2 жыл бұрын
Подскажите пожалуйста, а почему CreateNoteDto определяется в Web.Api проекте а не в Application как NoteLookupDto?
@PlatinumTechTalks
@PlatinumTechTalks 2 жыл бұрын
Одно для внутреннего использования, другое - торчит наружу
@stryder12345
@stryder12345 2 жыл бұрын
Получаю ошибку: Ошибка CS1061 "DbContextOptionsBuilder" не содержит определения "UseSqlite", и не удалось найти доступный метод расширения "UseSqlite", принимающий тип "DbContextOptionsBuilder" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку). Пакет переустанавливал, для уверенности скопировал с гитхаба все.
@PlatinumTechTalks
@PlatinumTechTalks 2 жыл бұрын
Я бы проверил версию пакета и то что он есть в csproj файле для начала.и то что название пакета совпадает с нужным
@kanalRAFA
@kanalRAFA Жыл бұрын
А что значит "??=" на 8:50 ? Подскажите пожалуйста.
@PlatinumTechTalks
@PlatinumTechTalks Жыл бұрын
получить IMediatr и присвоить, если _mediatr равен null подробнее тут: learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-coalescing-operator
@mykolagg706
@mykolagg706 Жыл бұрын
В готовом шаблоне VS Asp.Net.Core Web Api уже есть готовая архитектура работи с контроллерами, тестами и всеми настройками проекта включая DI и Swager.... Не понимаю зачем изобретать квадратное колесо?
@dannycyberwalker
@dannycyberwalker 3 жыл бұрын
Будет ссылка на репозиторий?
@PlatinumTechTalks
@PlatinumTechTalks 3 жыл бұрын
Будет. В ближайшее время добавим для каждого видео код из него
@PlatinumTechTalks
@PlatinumTechTalks 3 жыл бұрын
под каждым видео теперь добавлены ссылки на код из видео
@dannycyberwalker
@dannycyberwalker 3 жыл бұрын
@@PlatinumTechTalks Спасибо
@sots9819
@sots9819 2 жыл бұрын
Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 1: 'no such table: Notes'. at Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(Int32 rc, sqlite3 db) в каком участке кода ошибка?
@bek15071991
@bek15071991 3 жыл бұрын
Валидация данных где планируется?
@PlatinumTechTalks
@PlatinumTechTalks 3 жыл бұрын
Валидация данных будет в проекте Application. В следующем видео
@this_is_denys
@this_is_denys 2 жыл бұрын
А как быть в ASP.NET 6? Здесь же убрали файл Startup.cs, теперь все в файле Program.cs, как по уму всё сделать?
@PlatinumTechTalks
@PlatinumTechTalks 2 жыл бұрын
Там плюс минус тоже самое. Идеи о том как можно организовать код в файле Program.cs можно подчерпнуть из последнего видео по Minimal APIs (на данный момент последнее на канале)
@МаксимСпорт-ф3х
@МаксимСпорт-ф3х 2 жыл бұрын
@@PlatinumTechTalks поправьте, если ошибаюсь, новичок, потратил почти день, чтобы разобраться. Мой Program.cs в .net 6 выглядит следующим образом: using Notes.Application; using Notes.Application.Common.Mappings; using Notes.Application.Interfaces; using Notes.Persistence; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddApplication(); builder.Services.AddControllers(); builder.Services.AddPersistence(builder.Configuration); builder.Services.AddAutoMapper(config => { config.AddProfile(new AssemblyMappingProfile(typeof(Program).Assembly)); config.AddProfile(new AssemblyMappingProfile(typeof(INotesDbContext).Assembly)); }); builder.Services.AddCors(options => { options.AddPolicy("AllowAll", policy => { policy.AllowAnyHeader(); policy.AllowAnyMethod(); policy.AllowAnyOrigin(); }); }); // Learn more about configuring Swagger/OpenAPI at aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } using (var scope = app.Services.CreateScope()) { try { var context = scope.ServiceProvider.GetRequiredService(); DbInitializer.Initialize(context); } catch (Exception) { } } app.UseHttpsRedirection(); app.UseAuthorization(); app.UseCors("AllowAll"); app.MapControllers(); app.Run();
@winstochurgle9133
@winstochurgle9133 2 жыл бұрын
@@МаксимСпорт-ф3х var scope = builder.Services.BuildServiceProvider().CreateScope() :)
@kruzobackstage7026
@kruzobackstage7026 Жыл бұрын
@@МаксимСпорт-ф3х спасибо :)
@cegofont4132
@cegofont4132 6 ай бұрын
@@winstochurgle9133 Может лучше сделать так: var scope = app.Services.CreateScope(); , чтобы не появлялось напоминание ASP0000, что создается второй контейнер?
@dimka59ru
@dimka59ru 4 ай бұрын
Весьма странное решение мапить дто в команду...
@PlatinumTechTalks
@PlatinumTechTalks Ай бұрын
Почему?
@stryder12345
@stryder12345 2 жыл бұрын
Я все перепроверил, но у меня база данных не создается
@PlatinumTechTalks
@PlatinumTechTalks 2 жыл бұрын
Если с гитхаба взять репозиторий, то тоже не создается?
@stryder12345
@stryder12345 2 жыл бұрын
@@PlatinumTechTalks я скопировал все, что было, не создает, ошибок никаких нет
@PlatinumTechTalks
@PlatinumTechTalks 2 жыл бұрын
Если продебажить то вызывается ли метод EnsureCreated?
@stryder12345
@stryder12345 2 жыл бұрын
@@PlatinumTechTalks нет, он не вызывался, я полностью пересоздал проект, все заработало.
@basillkravchuk744
@basillkravchuk744 2 жыл бұрын
using Microsoft.EntityFrameworkCore; using Notes.Application.Interfaces; using Notes.Domain; using Notes.Persistence.EntityTypeConfigurations; namespace Notes.Persistence { public class NotesDbContext : DbContext, INotesDbContext { public DbSet Notes { get; set; } public NotesDbContext(DbContextOptions options) : base(options) { } protected override void OnModelCreating(ModelBuilder builder) { builder.ApplyConfiguration(new NoteConfiguration()); base.OnModelCreating(builder); } } } UsersDbContext.cs файл. Написал вот так код из репозитория и все пошло.
@ziegimondvishneuski3317
@ziegimondvishneuski3317 2 жыл бұрын
Aes4e do s MiddleWare dobavliaütsia filtry))))
@Nik-cv5bi
@Nik-cv5bi Жыл бұрын
Для кого интересно это видео? Вы просто наложили звук на готовое, или я ничего не понимаю
@PlatinumTechTalks
@PlatinumTechTalks 8 ай бұрын
ну да, одно из двух
@nikolaifedorov685
@nikolaifedorov685 Жыл бұрын
ПО? Это что? точно не middleware! Переводчик!
@sergbo3114
@sergbo3114 Жыл бұрын
Считаю что для профессионального программирования перехватывать исключения и ничего с ним не делать это лютое зло. Ты просто можешь забыть об этом, а приложение будет просто молчаливо проглатывать команды/данные и никому ничего об этом не говорить, и еще хуже если это будет происходить изредка. Такое гавно придется долго искать. Хотя бы WriteLine в консоль.
@ITaras
@ITaras 3 жыл бұрын
Автор клоун,вместо того чтобы просто помочь устранить проблему,удаляет комменты)
@PlatinumTechTalks
@PlatinumTechTalks 3 жыл бұрын
С полной ответственностью могу заверить, что ни один комментарий не был удален на канале. А вот ваши одинаковые под каждым видео комментарии настораживают. Удачи вам)
@Кирилл-ж3м2н
@Кирилл-ж3м2н 3 жыл бұрын
@@PlatinumTechTalks комменты и вправду пропадают. Это ютуб чудит. Последнее время с ним это часто случается.
@this_is_denys
@this_is_denys 2 жыл бұрын
System.InvalidOperationException: The entity type 'List' requires a primary key to be defined. If you intended to use a keyless entity type, call 'HasNoKey' in 'OnModelCreating'. Как быть с таким исключением?
@PlatinumTechTalks
@PlatinumTechTalks 2 жыл бұрын
Проверьте конфигурацию для энтити
Всё об Entity Framework Core
2:38:04
Platinum DEV
Рет қаралды 55 М.
Don't underestimate anyone
00:47
奇軒Tricking
Рет қаралды 21 МЛН
Молодой боец приземлил легенду!
01:02
МИНУС БАЛЛ
Рет қаралды 2,1 МЛН
Создаем масштабируемую архитектуру
14:56
FluentValidation - валидация данных с Fluent API
5:30
Марк Шевченко - Микросервисы на C#
1:02:10
Automapper в ASP.NET Web API
4:13
Platinum DEV
Рет қаралды 31 М.