如何解决MediatR错误:向容器注册处理程序
我有一个.Net Core应用程序,其中使用.AddMediatR扩展名来注册我的命令和处理程序的程序集
在Startup.cs的ConfigureServices中,我使用了扩展方法 从官方包 MediatR.Extensions.Microsoft.DependencyInjection与以下内容 参数:
startup.cs
services.AddBLL();
DependencyInjection.cs
public static IServiceCollection AddBLL(this IServiceCollection services)
{
services.AddAutoMapper(Assembly.GetExecutingAssembly());
services.AddMediatR(Assembly.GetExecutingAssembly());
services.AddTransient(typeof(IPipelineBehavior<,>),typeof(RequestPerformanceBehaviour<,>));
services.AddTransient(typeof(IPipelineBehavior<,typeof(RequestValidationBehavior<,>));
return services;
}
命令处理程序类如下: ListEpostaHesaplariHandler.cs
public class ListEpostaHesaplariRequest : IRequest<ResultDataDto<List<ListEpostaHesaplariDto>>>
{
public FiltreEpostaHesaplariDto Model { get; set; }
}
public class ListEpostaHesaplariHandler : IRequestHandler<ListEpostaHesaplariRequest,ResultDataDto<List<ListEpostaHesaplariDto>>>
{
private readonly IBaseDbContext _context;
private readonly IMapper _mapper;
public ListEpostaHesaplariHandler(IBaseDbContext context,IMapper mapper)
{
_context = context;
_mapper = mapper;
}
public async Task<ResultDataDto<List<ListEpostaHesaplariDto>>> Handle(ListEpostaHesaplariRequest request,CancellationToken cancellationToken)
{
await Task.Delay(1);
var resultDataDto = new ResultDataDto<List<ListEpostaHesaplariDto>>() { Status = ResultStatus.Success };
try
{
var foo = _context.EpostaHesaplari;
var filtreliEpostaHesaplari = Filtre(request.Model,foo);
var epostaHesaplariDto = _mapper.Map<List<ListEpostaHesaplariDto>>(filtreliEpostaHesaplari);
resultDataDto.Result = epostaHesaplariDto;
}
catch (Exception ex)
{
resultDataDto.Status = ResultStatus.Error;
resultDataDto.AddError(ex.Message);
}
return resultDataDto;
}
这是我使用MediatR的控制器
BaseController.cs
public abstract class BaseController : Controller
{
private IMediator _mediator;
public static int? birimIDD;
protected IMediator Mediator
{
get
{
return _mediator ??= HttpContext.RequestServices.GetService<IMediator>();
}
}
}
HomeController.cs
[HttpPost]
public async Task<IActionResult> MailGonderAsync()
{
FiltreEpostaHesaplariDto filtre = new FiltreEpostaHesaplariDto();
filtre.Durum = true;
var req = new ListEpostaHesaplariRequest() { Model = filtre };
var response = await Mediator.Send(req);
}
到目前为止,没有问题等待Mediator.Send(req);这个回应成功了
问题从这里开始
send.cs(在业务逻辑层中)
public class EmailSend : IEmailSingleSender
{
private readonly IMediator _mediator;
public EmailSend(IMediator mediator)
{
_mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
}
public async Task Send(EmailParamsDto emailParamsDto)
{
try
{
FiltreEpostaHesaplariDto filtre = new FiltreEpostaHesaplariDto();
filtre.Durum = true;
var req = new ListEpostaHesaplariRequest() { Model = filtre };
var response = await _mediator.Send(req);
SmtpClient smtpClient = new SmtpClient();
smtpClient.Port = _emailSetting.Port;
smtpClient.Host = _emailSetting.Server;
smtpClient.EnableSsl = _emailSetting.UseSsl;
NetworkCredential networkCredential = new NetworkCredential();
networkCredential.UserName = _emailSetting.UserName;
networkCredential.Password = _emailSetting.Password;
smtpClient.Credentials = networkCredential;
MailMessage mail = new MailMessage();
mail.IsBodyHtml = _emailSetting.IsHtml;
mail.From = new MailAddress(_emailSetting.UserName,emailParamsDto.Subject);
mail.To.Add(new MailAddress(emailParamsDto.Receiver));
//mail.CC.Add(_emailSetting.AdminMail);
mail.Body = emailParamsDto.Body;
mail.Subject = emailParamsDto.Subject;
mail.Priority = emailParamsDto.MailPriority;
await smtpClient.SendMailAsync(mail);
}
catch (Exception ex)
{
throw ex;
}
}
}
var response =等待_mediator.Send(req); 在send.cs中var response = await _mediator.Send(req);这条线运行时出现错误
为类型MediatR.IRequestHandler 2[IUC.BaseApplication.BLL.Handlers.Yonetim.EpostaHesaplariHandlers.ListEpostaHesaplariRequest,IUC.BaseApplication.COMMON.Models.ResultDataDto
1 [System.Collections.Generic.List`1 [IUC.BaseApplication.BLL.Models.Yonetim.EpostaHesaplariDto.ListEpostaHesaplariDto]]构造错误的处理程序。在容器中注册您的处理程序。有关示例,请参见GitHub中的示例。
解决方法
services.AddMediatR(Assembly.GetExecutingAssembly());
您所有的处理程序和命令都在您通过的程序集中?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。