#c# #.net #visual-studio #asp.net-core
#c# #.net #visual-studio #asp.net-ядро
Вопрос:
Я пытаюсь использовать MediatR с динамическим запросом, для этого я должен использовать общий класс «T», чтобы не дублировать работу
Система.Исключение AggregateException: «Произошла одна или несколько ошибок. (Обработчик не был найден для запроса типа MediatR.IRequestHandler `
я сталкиваюсь с этой ошибкой, и я понятия не имею, как это решить,, любая идея, пожалуйста
public class DynamicReportingQuery<T> : IRequest<T>
{
public class DynamicReportingQueryHandler : IRequestHandler<DynamicReportingQuery<T>, T>
{
protected IExitDbContext db;
public DynamicReportingQueryHandler(IExitDbContext db)
{
this.db = db;
}
public Task<T> Handle(DynamicReportingQuery<T> request, CancellationToken cancellationToken)
{
T response;
try
{
var parameters = new object[] {
new { name = "QuestionnaireId",value=request.Filter.QuestionnaireId },
new { name = "SeparationType" ,value=request.Filter.SeparationType},
new { name = "FromDate",value=request.Filter.From },
new { name = "ToDate" ,value=request.Filter.GetToDate()},
new { name = "EntityId",value=request.Filter.EntityId },
};
response = db.SingleRowExecuteStoredProcedure<T>(request.ProcdureName, parameters);
}
catch (Exception ex)
{
throw ex;
}
return Task.FromResult(response);
}
}
public ReportFilterationModel Filter { get; set; }
public string ProcdureName { get; set; }
}
Комментарии:
1. как вы его регистрируете?
2. @DanielA. Белый я добавил эту строку сервисов. AddMediatR (сборка. GetExecutingAssembly());
3. Пожалуйста, напишите, как вы отправляете команду через MediatR, и укажите, выполняется ли регистрация MediatR в той же сборке, где
DynamicReportingQuery
определена ваша.
Ответ №1:
Я решил это с помощью:
если вам нужно использовать класс T, вы должны зарегистрировать каждую модель, например
services.AddScoped<IRequestHandler<DynamicReportingQuery<EmployeeSeparationOverAllModel>, IEnumerable<EmployeeSeparationOverAllModel>>, DynamicReportingQueryHandler<EmployeeSeparationOverAllModel>>();
и вы должны отделить запрос самостоятельно
public class DynamicReportingQuery<T> : IRequest<T>
{
public ReportFilterationModel Filter { get; set; }
public string ProcdureName { get; set; }
}
и этот раздел
public class DynamicReportingQueryHandler<T> : IRequestHandler<DynamicReportingQuery<T>, T>
{
protected IExitDbContext db;
public DynamicReportingQueryHandler(IExitDbContext db)
{
this.db = db;
}
public Task<T> Handle(DynamicReportingQuery<T> request, CancellationToken cancellationToken)
{
T response;
try
{
var parameters = new object[] {
new { name = "QuestionnaireId",value=request.Filter.QuestionnaireId },
new { name = "SeparationType" ,value=request.Filter.SeparationType},
new { name = "FromDate",value=request.Filter.From },
new { name = "ToDate" ,value=request.Filter.GetToDate()},
new { name = "EntityId",value=request.Filter.EntityId },
};
response = db.SingleRowExecuteStoredProcedure<T>(request.ProcdureName, parameters);
}
catch (Exception ex)
{
throw ex;
}
return Task.FromResult(response);
}
}
таким образом, вам придется повторять код снова и снова с другой моделью
или заменять класс T типом объекта и оставлять приведенный выше код под вопросом.
разница между двумя способами заключается в:
первый:
- повторите код с разными моделями
- поддержка нескольких наборов данных
- изменяет свойства типов данных
второй:
- более простой и меньше кода
- не поддерживает множественный набор данных
- невозможно изменить типы данных свойств (необходимо преобразовать все данные со стороны базы данных)