динамический обработчик запроса MediatR не найден

#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 типом объекта и оставлять приведенный выше код под вопросом.

разница между двумя способами заключается в:

первый:

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

второй:

  • более простой и меньше кода
  • не поддерживает множественный набор данных
  • невозможно изменить типы данных свойств (необходимо преобразовать все данные со стороны базы данных)