【问题标题】:dynamic MediatR request handler not found未找到动态 MediatR 请求处理程序
【发布时间】:2021-01-06 08:04:37
【问题描述】:

我正在尝试将 MediatR 与动态查询一起使用 为此,我必须使用“T”通用类来不重复工作

System.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; }

    }

【问题讨论】:

  • 你是怎么注册的?
  • @DanielA.White 我已添加此行 services.AddMediatR(Assembly.GetExecutingAssembly());
  • 请发布您如何通过 MediatR 发送命令,并指定 MediatR 注册是否发生在定义您的 DynamicReportingQuery 的同一程序集中。

标签: c# .net visual-studio asp.net-core


【解决方案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 类替换为对象类型,并保留上面的代码。

两种方式的区别是:

第一个:

  • 用不同的模型重复代码
  • 支持多数据集
  • 更改属性数据类型

第二个:

  • 更简单,代码更少
  • 不支持多数据集
  • 无法更改属性数据类型(您必须转换所有数据 从数据库端)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    相关资源
    最近更新 更多