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

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

КОМЕНТАРІ • 85

  • @TpyHaGuBaTop
    @TpyHaGuBaTop 10 місяців тому +2

    Это видео интересно не для полных новичков, а для тех, кто уже умеет писать WebApi, но хочет научиться делать это, используя чистую архитектуру и best practices, которые можно встретить на реальных больших проектах. Лично для меня, работавшего 2 года с легаси и в глаза не видевшего clean architecture, этот плейлист действительно полезен и понятен. Такого контента не так уж много на ютубе. Автору большой респект

    • @PlatinumTechTalks
      @PlatinumTechTalks  10 місяців тому +2

      спасибо большое за такой отзыв!)

  • @Бот5329-и5г
    @Бот5329-и5г 2 роки тому +22

    А можете сделать урок по созданию API на обычной трехуровневой архитектуре. Ато этот пример очень конечно крутой, затрагивает много технологий но для новичка вроде меня очень сложен в понимании.

  • @antya1126
    @antya1126 7 місяців тому

    Спасибо большое за курс

  • @ДенисВикторович-л2о

    Курс отличный. На данном этапе мы реализовали контролер, и необходимые методы: добавление, изменение, удаление, получение всего списка. Вот вопрос, а блоки try catch почти нигде не писали. Это нормально? вдруг будет ошибка например при добавлении записи, ошибка в базе данных, вот возникнет в классе class DeleteNoteCommandHandler. Получается лажет приложение? Я интересуюсь, потому что хочу знать, где в реальных приложения правильно использовать отлов ошибок. Абсолютно везде использовать блоки try catch не вариант. Использовать на самых высоких уровнях? например в контролерах???? Хотелось бы услышать ваш совет.

  • @ИльяИгоревич-й8е

    обожаю оверинженеринг) не вижу смысла в коммандах, запросах, если сервис прекрасно справляется

  • @ИванСарычев-я4ж
    @ИванСарычев-я4ж Рік тому +2

    13:18 минуте видео у нас неожиданно появляется база данных Platinum.
    Объясните как ее ввести

    • @ВикторБелянкин-м1щ
      @ВикторБелянкин-м1щ Рік тому

      У меня кроме матов по этому поводу больше никаких эмоций нету, и так сложно, дак еще и файлы откуда-то появляются.

    • @murr_ka4374
      @murr_ka4374 7 місяців тому

      @@ВикторБелянкин-м1щ Надо миграцию сделать, чтобы база появилась. А в видео этот момент почему-то опущен.

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

    Спасибо🙏

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

    Зачем делать маппинг из класса для Request (CreateNoteCommand) в CreateNoteDTO?
    В API будет прилетать как раз DTO объект (или объект его содержащий), который можно записывать в свойство класса Request'a, а в Handle уже производить маппинг.
    Поправьте, если ошибаюсь, но вообще маппинг используется между DTO и оригинальным объектом.

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

    Подскажите пожалуйста, на какой уровень, согласно данной модели, необходимо выносить "сложную" логику запросов?
    Например, для выполнения запроса, мне необходимо сперва получить 2 разные сущности (для этого я делаю 2 разных query?), затем проверить их данные, и, при выполнении условий, создать сущность третьего типа (запрос command).
    На уровне Application или WebApi? Особенно, если подобные действия могут вызываться в разных контроллерах?

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

      тут напрашивается прослойка в виде сервиса на уровне Application. Поправьте, если ошибаюсь

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

    Подскажите, пожалуйста, а зачем мы прописываем роутинг контроллеру, если мы уже в base controller писали этот атрибут?

  • @dimitrisinger868
    @dimitrisinger868 11 місяців тому

    Это уже седьмое видео по счету и только сейчас автор запускает первый раз Веб-Апи. И только сейчас у меня выясняется что база данных не создается и есть еще другие ошибки. И где я ошибся придется долго искать. Не лучше было бы каждый шаг проверять, а не на седьмом видео. А еще лучше было бы автору выложить весь проект, чтобы можно было легче найти ошибку у себя.
    В любом случае спасибо автору за труд.

    • @PlatinumTechTalks
      @PlatinumTechTalks  10 місяців тому

      под каждым видео в описании есть ссылка на коммит с тем состоянием кода, в котором он был к концу урока, это может помочь, спасибо за фидбек

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

    А что значит "??=" на 8:50 ?
    Подскажите пожалуйста.

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

      получить IMediatr и присвоить, если _mediatr равен null
      подробнее тут: learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-coalescing-operator

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

    Спасибо

  • @ИванК-в3б
    @ИванК-в3б 2 роки тому +2

    Спасибо за серию уроков, многие вещи для меня теперь стали более понятными, но при запуске проекта выдает ошибку HTTP Error 502.5 - Process Failure. Можете подсказать, в какую сторону копать, чтобы найти причину?

    • @Amir-xg4nn
      @Amir-xg4nn 2 роки тому

      Проблема в Program.cs или Startup.cs. От версии asp net core зависит стоит ли использовать эти Startup

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

    хм, получается нам не нужны ef dotnet tools?

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

    В готовом шаблоне VS Asp.Net.Core Web Api уже есть готовая архитектура работи с контроллерами, тестами и всеми настройками проекта включая DI и Swager.... Не понимаю зачем изобретать квадратное колесо?

  • @МарияСорокина-ъ3з
    @МарияСорокина-ъ3з 2 роки тому +1

    Подскажите пожалуйста, при попытке сделать запрос в постмане, в таске getall() nullreference, медиатор = null. В чем может быть ошибка? Использую asp.net 6.

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

      Он у вас инициализируется? Посмотрите BaseController и DependencyInjection в Application, поставьте точки останова и тд

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

      Добрый день. Попробуйте следующее, в Notes.Application-> class DependencyInjection -> добавить: services.AddMediatR(Assembly.GetExecutingAssembly());
      return services;

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

      @@clutchmeisteryo9831 Спасибо!

    • @Emir-ry9yl
      @Emir-ry9yl Рік тому

      @@clutchmeisteryo9831 лучший брат

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

    Подскажите, пожалуйста, при запросе api/note
    выдает ошибку в строке var vm = await Mediator.Send(query) - System.NullReferenceException: "Object reference not set to an instance of an object.", с чем это может быть связанно?

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

    Подскажите пожалуйста, а почему CreateNoteDto определяется в Web.Api проекте а не в Application как NoteLookupDto?

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

      Одно для внутреннего использования, другое - торчит наружу

  • @ValentinAntinicotine
    @ValentinAntinicotine 3 роки тому +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 роки тому +2

      Лучше поздно, чем никогда. Мне помогло следующее:
      Я на .NET 7 делал, уже минимал апи, нету файла Startup.cs
      В программе в try блоке строчка
      var context = serviceProvider.GetRequiredService();
      вызывалась раньше, чем инжектился сервис дб контекста в метода расширение AddPersistence
      поэтому надо сначала делать builder.Services.AddPersistence, а только потом трай блок с получением сервиса контекста и db initialize

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

      @@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.

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

    Больше спасибо за этот замечательный урок! Но осталось лёгкое непонимание при работе с контроллером, в частности с getall. Мы отправляем команду в хандлер, который берет данные из дбконтекста. Почему же тогда мы не получаем ошибку от сервера, что ни таблица notes ни сама база данных не создана... Хотя запрос успешно выполняется (пусть и пустой список, ведь пустой список это все равно результат работы БАЗЫ ДАННЫХ)

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

      спасибо! База создается при старте приложения когда вызывается EnsureCreated

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

    Добрый день ! Подскажите, какие еще есть инструменты , кроме ПостМана, для проверки API?

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

      Здравствуйте! Insomnia, Fiddler, Hoppscotch (aka PostWoman), консольная утилита httprepl.

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

      @@PlatinumTechTalks спасибо)

  • @ВладимирПавлов-ф7б

    Добрый день. У вас в методе 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 роки тому +1

      В первый параметр можно передать просто ссылку на созданный объект. Например так “www.example.com/api/controller/id” где id это айди только что созданного объекта. Вероятно можно просто айди строкой без ссылки отдавать. Это то что клиенту вернется в заголовке ответа. Во втором параметре можно передать что угодно, можно айдишник, можно сам объект. В зависимости от нужд. Клиенту это вернется в теле ответа. (глупых вопросов не бывает)

  • @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

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

    Получаю ошибку:
    Ошибка CS1061 "DbContextOptionsBuilder" не содержит определения "UseSqlite", и не удалось найти доступный метод расширения "UseSqlite", принимающий тип "DbContextOptionsBuilder" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).
    Пакет переустанавливал, для уверенности скопировал с гитхаба все.

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

      Я бы проверил версию пакета и то что он есть в csproj файле для начала.и то что название пакета совпадает с нужным

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

    Валидация данных где планируется?

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

      Валидация данных будет в проекте Application. В следующем видео

  • @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)
    в каком участке кода ошибка?

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

    А как быть в ASP.NET 6? Здесь же убрали файл Startup.cs, теперь все в файле Program.cs, как по уму всё сделать?

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

      Там плюс минус тоже самое. Идеи о том как можно организовать код в файле Program.cs можно подчерпнуть из последнего видео по Minimal APIs (на данный момент последнее на канале)

    • @МаксимСпорт-ф3х
      @МаксимСпорт-ф3х 2 роки тому +3

      @@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 роки тому +2

      @@МаксимСпорт-ф3х var scope = builder.Services.BuildServiceProvider().CreateScope() :)

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

      @@МаксимСпорт-ф3х спасибо :)

    • @cegofont4132
      @cegofont4132 7 місяців тому

      @@winstochurgle9133 Может лучше сделать так: var scope = app.Services.CreateScope(); , чтобы не появлялось напоминание ASP0000, что создается второй контейнер?

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

    Будет ссылка на репозиторий?

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

      Будет. В ближайшее время добавим для каждого видео код из него

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

      под каждым видео теперь добавлены ссылки на код из видео

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

      @@PlatinumTechTalks Спасибо

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

    Aes4e do s MiddleWare dobavliaütsia filtry))))

  • @dimka59ru
    @dimka59ru 5 місяців тому

    Весьма странное решение мапить дто в команду...

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

    Я все перепроверил, но у меня база данных не создается

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

      Если с гитхаба взять репозиторий, то тоже не создается?

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

      @@PlatinumTechTalks я скопировал все, что было, не создает, ошибок никаких нет

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

      Если продебажить то вызывается ли метод EnsureCreated?

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

      @@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 файл. Написал вот так код из репозитория и все пошло.

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

    ПО? Это что? точно не middleware! Переводчик!

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

    Считаю что для профессионального программирования перехватывать исключения и ничего с ним не делать это лютое зло. Ты просто можешь забыть об этом, а приложение будет просто молчаливо проглатывать команды/данные и никому ничего об этом не говорить, и еще хуже если это будет происходить изредка. Такое гавно придется долго искать. Хотя бы WriteLine в консоль.

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

    Автор клоун,вместо того чтобы просто помочь устранить проблему,удаляет комменты)

    • @PlatinumTechTalks
      @PlatinumTechTalks  3 роки тому +8

      С полной ответственностью могу заверить, что ни один комментарий не был удален на канале. А вот ваши одинаковые под каждым видео комментарии настораживают. Удачи вам)

    • @Кирилл-ж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 роки тому +1

      Проверьте конфигурацию для энтити