Это видео интересно не для полных новичков, а для тех, кто уже умеет писать WebApi, но хочет научиться делать это, используя чистую архитектуру и best practices, которые можно встретить на реальных больших проектах. Лично для меня, работавшего 2 года с легаси и в глаза не видевшего clean architecture, этот плейлист действительно полезен и понятен. Такого контента не так уж много на ютубе. Автору большой респект
@PlatinumTechTalks8 ай бұрын
спасибо большое за такой отзыв!)
@Бот5329-и5г2 жыл бұрын
А можете сделать урок по созданию API на обычной трехуровневой архитектуре. Ато этот пример очень конечно крутой, затрагивает много технологий но для новичка вроде меня очень сложен в понимании.
@antya11266 ай бұрын
Спасибо большое за курс
@ИльяИгоревич-й8е Жыл бұрын
обожаю оверинженеринг) не вижу смысла в коммандах, запросах, если сервис прекрасно справляется
@IvanenkoStepan3 жыл бұрын
Спасибо🙏
@PlatinumTechTalks3 жыл бұрын
Вам спасибо!!
@dimitrisinger86810 ай бұрын
Это уже седьмое видео по счету и только сейчас автор запускает первый раз Веб-Апи. И только сейчас у меня выясняется что база данных не создается и есть еще другие ошибки. И где я ошибся придется долго искать. Не лучше было бы каждый шаг проверять, а не на седьмом видео. А еще лучше было бы автору выложить весь проект, чтобы можно было легче найти ошибку у себя. В любом случае спасибо автору за труд.
@PlatinumTechTalks8 ай бұрын
под каждым видео в описании есть ссылка на коммит с тем состоянием кода, в котором он был к концу урока, это может помочь, спасибо за фидбек
@ДенисВикторович-л2о2 жыл бұрын
Курс отличный. На данном этапе мы реализовали контролер, и необходимые методы: добавление, изменение, удаление, получение всего списка. Вот вопрос, а блоки try catch почти нигде не писали. Это нормально? вдруг будет ошибка например при добавлении записи, ошибка в базе данных, вот возникнет в классе class DeleteNoteCommandHandler. Получается лажет приложение? Я интересуюсь, потому что хочу знать, где в реальных приложения правильно использовать отлов ошибок. Абсолютно везде использовать блоки try catch не вариант. Использовать на самых высоких уровнях? например в контролерах???? Хотелось бы услышать ваш совет.
@Fikusiklol Жыл бұрын
Зачем делать маппинг из класса для Request (CreateNoteCommand) в CreateNoteDTO? В API будет прилетать как раз DTO объект (или объект его содержащий), который можно записывать в свойство класса Request'a, а в Handle уже производить маппинг. Поправьте, если ошибаюсь, но вообще маппинг используется между DTO и оригинальным объектом.
@BraentR3 жыл бұрын
Спасибо
@ИванСарычев-я4ж Жыл бұрын
13:18 минуте видео у нас неожиданно появляется база данных Platinum. Объясните как ее ввести
@ВикторБелянкин-м1щ Жыл бұрын
У меня кроме матов по этому поводу больше никаких эмоций нету, и так сложно, дак еще и файлы откуда-то появляются.
@murr_ka43745 ай бұрын
@@ВикторБелянкин-м1щ Надо миграцию сделать, чтобы база появилась. А в видео этот момент почему-то опущен.
@qofi49223 жыл бұрын
Подскажите пожалуйста, на какой уровень, согласно данной модели, необходимо выносить "сложную" логику запросов? Например, для выполнения запроса, мне необходимо сперва получить 2 разные сущности (для этого я делаю 2 разных query?), затем проверить их данные, и, при выполнении условий, создать сущность третьего типа (запрос command). На уровне Application или WebApi? Особенно, если подобные действия могут вызываться в разных контроллерах?
@june38782 жыл бұрын
тут напрашивается прослойка в виде сервиса на уровне Application. Поправьте, если ошибаюсь
@Avin0f Жыл бұрын
Подскажите, пожалуйста, а зачем мы прописываем роутинг контроллеру, если мы уже в base controller писали этот атрибут?
@ИванК-в3б2 жыл бұрын
Спасибо за серию уроков, многие вещи для меня теперь стали более понятными, но при запуске проекта выдает ошибку HTTP Error 502.5 - Process Failure. Можете подсказать, в какую сторону копать, чтобы найти причину?
@Amir-xg4nn Жыл бұрын
Проблема в Program.cs или Startup.cs. От версии asp net core зависит стоит ли использовать эти Startup
@june38782 жыл бұрын
хм, получается нам не нужны ef dotnet tools?
@ohmygoodness46532 жыл бұрын
Больше спасибо за этот замечательный урок! Но осталось лёгкое непонимание при работе с контроллером, в частности с getall. Мы отправляем команду в хандлер, который берет данные из дбконтекста. Почему же тогда мы не получаем ошибку от сервера, что ни таблица notes ни сама база данных не создана... Хотя запрос успешно выполняется (пусть и пустой список, ведь пустой список это все равно результат работы БАЗЫ ДАННЫХ)
@PlatinumTechTalks2 жыл бұрын
спасибо! База создается при старте приложения когда вызывается EnsureCreated
@deniskozhukhar469 Жыл бұрын
Подскажите, пожалуйста, при запросе api/note выдает ошибку в строке var vm = await Mediator.Send(query) - System.NullReferenceException: "Object reference not set to an instance of an object.", с чем это может быть связанно?
@ЯрославПроцик-г8я Жыл бұрын
У меня такая же ошибка, ты как-то её исправил?
@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 Жыл бұрын
Разобрался, унаследовал хэндлер сразу от IRequest и IRequest
@ВладимирПавлов-ф7б2 жыл бұрын
Добрый день. У вас в методе Task Create(CreateNoteDto createNoteDto) - который создаёт запись, возвращается Ok(noteId). Соответственно StatusCodes будет 200. Но это же не совсем правильно. Мы же должны возвращать 201 через Created(). Тем более, что вы когда описание для сваггера делали, так и написали [ProducesResponseType(StatusCodes.Status201Created)]. Как исправить метод?
@PlatinumTechTalks2 жыл бұрын
Здравствуйте. Видимо, опечатка. Нужно тогда return Created(noteId);
@ВладимирПавлов-ф7б2 жыл бұрын
@@PlatinumTechTalks created требует два параметра. первый - урл. И вот какой урл подставить я не знаю. нам же вроде не надо никуда переходить... (извините за глупые вопросы)
@PlatinumTechTalks2 жыл бұрын
В первый параметр можно передать просто ссылку на созданный объект. Например так “www.example.com/api/controller/id” где id это айди только что созданного объекта. Вероятно можно просто айди строкой без ссылки отдавать. Это то что клиенту вернется в заголовке ответа. Во втором параметре можно передать что угодно, можно айдишник, можно сам объект. В зависимости от нужд. Клиенту это вернется в теле ответа. (глупых вопросов не бывает)
@МарияСорокина-ъ3з2 жыл бұрын
Подскажите пожалуйста, при попытке сделать запрос в постмане, в таске getall() nullreference, медиатор = null. В чем может быть ошибка? Использую asp.net 6.
@PlatinumTechTalks2 жыл бұрын
Он у вас инициализируется? Посмотрите BaseController и DependencyInjection в Application, поставьте точки останова и тд
@clutchmeisteryo98312 жыл бұрын
Добрый день. Попробуйте следующее, в Notes.Application-> class DependencyInjection -> добавить: services.AddMediatR(Assembly.GetExecutingAssembly()); return services;
@NikolayShelakhaev2 жыл бұрын
@@clutchmeisteryo9831 Спасибо!
@Emir-ry9yl Жыл бұрын
@@clutchmeisteryo9831 лучший брат
@krahmaletskrakmalets75872 жыл бұрын
Добрый день ! Подскажите, какие еще есть инструменты , кроме ПостМана, для проверки API?
Не знаю где я и что пропустил, но пересмотрел все на 5 раз, перепроверил также. Выдает ошибку в Postman: Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 1: 'no such table: Notes'. Как я понимаю не создается таблица, база данных есть, а таблицы внутри нет. Если сможете, подскажите пожалуйста в каком направлении копать.. Спасибо.
@Кирилл-ж3м2н3 жыл бұрын
В DbInitializer метод Initialize. Или NotesDbContext, метод OnModelCreating
@ValentinAntinicotine3 жыл бұрын
@@Кирилл-ж3м2н Спасибо за направление.
@mr.kirill90603 жыл бұрын
@@ValentinAntinicotine Нужно не забыть вызвать .Initialize(context) в Program.cs в блоке try :-)
@kpssnik95702 жыл бұрын
Лучше поздно, чем никогда. Мне помогло следующее: Я на .NET 7 делал, уже минимал апи, нету файла Startup.cs В программе в try блоке строчка var context = serviceProvider.GetRequiredService(); вызывалась раньше, чем инжектился сервис дб контекста в метода расширение AddPersistence поэтому надо сначала делать builder.Services.AddPersistence, а только потом трай блок с получением сервиса контекста и db initialize
@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.
@kokoshko19852 жыл бұрын
Подскажите пожалуйста, а почему CreateNoteDto определяется в Web.Api проекте а не в Application как NoteLookupDto?
@PlatinumTechTalks2 жыл бұрын
Одно для внутреннего использования, другое - торчит наружу
@stryder123452 жыл бұрын
Получаю ошибку: Ошибка CS1061 "DbContextOptionsBuilder" не содержит определения "UseSqlite", и не удалось найти доступный метод расширения "UseSqlite", принимающий тип "DbContextOptionsBuilder" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку). Пакет переустанавливал, для уверенности скопировал с гитхаба все.
@PlatinumTechTalks2 жыл бұрын
Я бы проверил версию пакета и то что он есть в csproj файле для начала.и то что название пакета совпадает с нужным
@kanalRAFA Жыл бұрын
А что значит "??=" на 8:50 ? Подскажите пожалуйста.
@PlatinumTechTalks Жыл бұрын
получить IMediatr и присвоить, если _mediatr равен null подробнее тут: learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-coalescing-operator
@mykolagg706 Жыл бұрын
В готовом шаблоне VS Asp.Net.Core Web Api уже есть готовая архитектура работи с контроллерами, тестами и всеми настройками проекта включая DI и Swager.... Не понимаю зачем изобретать квадратное колесо?
@dannycyberwalker3 жыл бұрын
Будет ссылка на репозиторий?
@PlatinumTechTalks3 жыл бұрын
Будет. В ближайшее время добавим для каждого видео код из него
@PlatinumTechTalks3 жыл бұрын
под каждым видео теперь добавлены ссылки на код из видео
@dannycyberwalker3 жыл бұрын
@@PlatinumTechTalks Спасибо
@sots98192 жыл бұрын
Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 1: 'no such table: Notes'. at Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(Int32 rc, sqlite3 db) в каком участке кода ошибка?
@bek150719913 жыл бұрын
Валидация данных где планируется?
@PlatinumTechTalks3 жыл бұрын
Валидация данных будет в проекте Application. В следующем видео
@this_is_denys2 жыл бұрын
А как быть в ASP.NET 6? Здесь же убрали файл Startup.cs, теперь все в файле Program.cs, как по уму всё сделать?
@PlatinumTechTalks2 жыл бұрын
Там плюс минус тоже самое. Идеи о том как можно организовать код в файле Program.cs можно подчерпнуть из последнего видео по Minimal APIs (на данный момент последнее на канале)
@МаксимСпорт-ф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();
@winstochurgle91332 жыл бұрын
@@МаксимСпорт-ф3х var scope = builder.Services.BuildServiceProvider().CreateScope() :)
@kruzobackstage7026 Жыл бұрын
@@МаксимСпорт-ф3х спасибо :)
@cegofont41326 ай бұрын
@@winstochurgle9133 Может лучше сделать так: var scope = app.Services.CreateScope(); , чтобы не появлялось напоминание ASP0000, что создается второй контейнер?
@dimka59ru4 ай бұрын
Весьма странное решение мапить дто в команду...
@PlatinumTechTalksАй бұрын
Почему?
@stryder123452 жыл бұрын
Я все перепроверил, но у меня база данных не создается
@PlatinumTechTalks2 жыл бұрын
Если с гитхаба взять репозиторий, то тоже не создается?
@stryder123452 жыл бұрын
@@PlatinumTechTalks я скопировал все, что было, не создает, ошибок никаких нет
@PlatinumTechTalks2 жыл бұрын
Если продебажить то вызывается ли метод EnsureCreated?
@stryder123452 жыл бұрын
@@PlatinumTechTalks нет, он не вызывался, я полностью пересоздал проект, все заработало.
@basillkravchuk7442 жыл бұрын
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 файл. Написал вот так код из репозитория и все пошло.
@ziegimondvishneuski33172 жыл бұрын
Aes4e do s MiddleWare dobavliaütsia filtry))))
@Nik-cv5bi Жыл бұрын
Для кого интересно это видео? Вы просто наложили звук на готовое, или я ничего не понимаю
@PlatinumTechTalks8 ай бұрын
ну да, одно из двух
@nikolaifedorov685 Жыл бұрын
ПО? Это что? точно не middleware! Переводчик!
@sergbo3114 Жыл бұрын
Считаю что для профессионального программирования перехватывать исключения и ничего с ним не делать это лютое зло. Ты просто можешь забыть об этом, а приложение будет просто молчаливо проглатывать команды/данные и никому ничего об этом не говорить, и еще хуже если это будет происходить изредка. Такое гавно придется долго искать. Хотя бы WriteLine в консоль.
@ITaras3 жыл бұрын
Автор клоун,вместо того чтобы просто помочь устранить проблему,удаляет комменты)
@PlatinumTechTalks3 жыл бұрын
С полной ответственностью могу заверить, что ни один комментарий не был удален на канале. А вот ваши одинаковые под каждым видео комментарии настораживают. Удачи вам)
@Кирилл-ж3м2н3 жыл бұрын
@@PlatinumTechTalks комменты и вправду пропадают. Это ютуб чудит. Последнее время с ним это часто случается.
@this_is_denys2 жыл бұрын
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'. Как быть с таким исключением?