Я пытаюсь настроить для себя шаблон, используя .NET 8, PostgreSQL в качестве базы данных и шаблон CQRS (с библиотекой MediatR).
Я выполнил всю настройку, но когда я пробую простой QueryHandler, я получаю следующую ошибку:
System.InvalidOperationException: The exception handler configured on ExceptionHandlerOptions produced a 404 status response. This InvalidOperationException containing the original exception was thrown since this is often due to a misconfigured ExceptionHandlingPath. If the exception handler is expected to return 404 status responses then set AllowStatusCode404Response to true.
---> System.InvalidOperationException: Cannot resolve 'MediatR.IRequestHandler`2[Application.Features.Todo.Queries.GetAllTodos.GetAllTodosQuery,System.Collections.Generic.List`1[Application.Dtos.Todo.TodoDto]]' from root provider because it requires scoped service 'Infrastructure.Data.ApplicationDbContext'.
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(ServiceCallSite callSite, IServiceScope scope, IServiceScope rootScope)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(ServiceIdentifier serviceIdentifier, ServiceProviderEngineScope serviceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
at MediatR.Wrappers.RequestHandlerWrapperImpl`2.c__DisplayClass1_0.g__Handler|0()
at MediatR.Wrappers.RequestHandlerWrapperImpl`2.Handle(IRequest`1 request, IServiceProvider serviceProvider, CancellationToken cancellationToken)
at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)
at Presentation.Endpoints.Todo.TodoEndpoints.b__3_0() in /Users/manuelraso/Documents/repo/wanderlust-nest/backend/src/Presentation/Endpoints/Todo/TodoEndpoints.cs:line 23
at Microsoft.AspNetCore.Http.RequestDelegateFactory.g__ExecuteAwaited|133_0[T](Task`1 task, HttpContext httpContext, JsonTypeInfo`1 jsonTypeInfo)
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddlewareImpl.g__Awaited|10_0(ExceptionHandlerMiddlewareImpl middleware, HttpContext context, Task task)
--- End of inner exception stack trace ---
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddlewareImpl.HandleException(HttpContext context, ExceptionDispatchInfo edi)
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddlewareImpl.g__Awaited|10_0(ExceptionHandlerMiddlewareImpl middleware, HttpContext context, Task task)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
Вот как я настроил DbContext (я тоже пробовал с ServiceLifetime.Transient):
var connectionString = configuration["ConnectionStrings:DefaultConnection"];
services.AddDbContext(
options => options.UseNpgsql(connectionString),
ServiceLifetime.Scoped);
Вот как я регистрирую MediatR:
services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssemblies(
[
Assembly.GetExecutingAssembly(), // Assembly Application
]);
});
Это QueryHandler:
internal sealed class GetAllTodosQueryHandler: IRequestHandler
{
private readonly ApplicationDbContext _context;
public GetAllTodosQueryHandler(ApplicationDbContext context)
{
_context = context;
}
async Task IRequestHandler.Handle(GetAllTodosQuery request, CancellationToken cancellationToken)
{
var test = await _context.Todos.ToListAsync(cancellationToken);
return await Task.FromResult(test.Adapt());
}
}
Вот как я отправляю запрос (я пробовал внедрить ISender и создать область MediatR, но та же ошибка):
public class TodoEndpoints : CarterModule
{
private readonly ISender _sender;
private readonly IServiceScopeFactory _serviceScopeFactory;
public TodoEndpoints(ISender sender, IServiceScopeFactory serviceScopeFactory)
: base("/todo")
{
_sender = sender;
_serviceScopeFactory = serviceScopeFactory;
}
public override void AddRoutes(IEndpointRouteBuilder app)
{
app.MapGet("/", async () => await _sender.Send(new GetAllTodosQuery()));
app.MapGet("/test", async () =>
{
using var scope = _serviceScopeFactory.CreateScope();
var mediator = scope.ServiceProvider.GetRequiredService();
return await mediator.Send(new GetAllTodosQuery());
});
}
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... -dbcontext
Внедрение зависимостей MediatR с помощью PostgreSQL DbContext ⇐ C#
Место общения программистов C#
-
Anonymous
1733214134
Anonymous
Я пытаюсь настроить для себя шаблон, используя .NET 8, PostgreSQL в качестве базы данных и шаблон CQRS (с библиотекой MediatR).
Я выполнил всю настройку, но когда я пробую простой QueryHandler, я получаю следующую ошибку:
System.InvalidOperationException: The exception handler configured on ExceptionHandlerOptions produced a 404 status response. This InvalidOperationException containing the original exception was thrown since this is often due to a misconfigured ExceptionHandlingPath. If the exception handler is expected to return 404 status responses then set AllowStatusCode404Response to true.
---> System.InvalidOperationException: Cannot resolve 'MediatR.IRequestHandler`2[Application.Features.Todo.Queries.GetAllTodos.GetAllTodosQuery,System.Collections.Generic.List`1[Application.Dtos.Todo.TodoDto]]' from root provider because it requires scoped service 'Infrastructure.Data.ApplicationDbContext'.
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(ServiceCallSite callSite, IServiceScope scope, IServiceScope rootScope)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(ServiceIdentifier serviceIdentifier, ServiceProviderEngineScope serviceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
at MediatR.Wrappers.RequestHandlerWrapperImpl`2.c__DisplayClass1_0.g__Handler|0()
at MediatR.Wrappers.RequestHandlerWrapperImpl`2.Handle(IRequest`1 request, IServiceProvider serviceProvider, CancellationToken cancellationToken)
at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)
at Presentation.Endpoints.Todo.TodoEndpoints.b__3_0() in /Users/manuelraso/Documents/repo/wanderlust-nest/backend/src/Presentation/Endpoints/Todo/TodoEndpoints.cs:line 23
at Microsoft.AspNetCore.Http.RequestDelegateFactory.g__ExecuteAwaited|133_0[T](Task`1 task, HttpContext httpContext, JsonTypeInfo`1 jsonTypeInfo)
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddlewareImpl.g__Awaited|10_0(ExceptionHandlerMiddlewareImpl middleware, HttpContext context, Task task)
--- End of inner exception stack trace ---
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddlewareImpl.HandleException(HttpContext context, ExceptionDispatchInfo edi)
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddlewareImpl.g__Awaited|10_0(ExceptionHandlerMiddlewareImpl middleware, HttpContext context, Task task)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
Вот как я настроил DbContext (я тоже пробовал с ServiceLifetime.Transient):
var connectionString = configuration["ConnectionStrings:DefaultConnection"];
services.AddDbContext(
options => options.UseNpgsql(connectionString),
ServiceLifetime.Scoped);
Вот как я регистрирую MediatR:
services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssemblies(
[
Assembly.GetExecutingAssembly(), // Assembly Application
]);
});
Это QueryHandler:
internal sealed class GetAllTodosQueryHandler: IRequestHandler
{
private readonly ApplicationDbContext _context;
public GetAllTodosQueryHandler(ApplicationDbContext context)
{
_context = context;
}
async Task IRequestHandler.Handle(GetAllTodosQuery request, CancellationToken cancellationToken)
{
var test = await _context.Todos.ToListAsync(cancellationToken);
return await Task.FromResult(test.Adapt());
}
}
Вот как я отправляю запрос (я пробовал внедрить ISender и создать область MediatR, но та же ошибка):
public class TodoEndpoints : CarterModule
{
private readonly ISender _sender;
private readonly IServiceScopeFactory _serviceScopeFactory;
public TodoEndpoints(ISender sender, IServiceScopeFactory serviceScopeFactory)
: base("/todo")
{
_sender = sender;
_serviceScopeFactory = serviceScopeFactory;
}
public override void AddRoutes(IEndpointRouteBuilder app)
{
app.MapGet("/", async () => await _sender.Send(new GetAllTodosQuery()));
app.MapGet("/test", async () =>
{
using var scope = _serviceScopeFactory.CreateScope();
var mediator = scope.ServiceProvider.GetRequiredService();
return await mediator.Send(new GetAllTodosQuery());
});
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79246783/dependency-injection-mediatr-with-postgresql-dbcontext[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия