ASP.NET Core MediatR错误:使用容器注册处理程序

Mik*_*ins 12 autofac mediatr asp.net-core

我有一个.Net Core应用程序,我使用.AddMediatR扩展来按照CQRS方法为我的命令和处理程序注册程序集.

在Startup.cs中的ConfigureServices中,我使用了官方包中的扩展方法,MediatR.Extensions.Microsoft.DependencyInjection其中包含以下参数:

services.AddMediatR(typeof(AddEducationCommand).GetTypeInfo().Assembly);  
Run Code Online (Sandbox Code Playgroud)

命令和命令处理程序类如下:

AddEducationCommand.cs

public class AddEducationCommand : IRequest<bool>
{
    [DataMember]
    public int UniversityId { get; set; }

    [DataMember]
    public int FacultyId { get; set; }

    [DataMember]
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

AddEducationCommandHandler.cs

public class AddEducationCommandHandler : IRequestHandler<AddEducationCommand, bool>
    {
        private readonly IUniversityRepository _repository;
        public AddEducationCommandHandler(IUniversityRepository repository)
        {
            _repository = repository;
        }

        public async Task<bool> Handle(AddEducationCommand command, CancellationToken cancellationToken)
        {
            var university = await _repository.GetAsync(command.UniversityId);

            university.Faculties
                .FirstOrDefault(f => f.Id == command.FacultyId)
                .CreateEducation(command.Name);

            return await _repository.UnitOfWork.SaveEntitiesAsync();
        }
    }
Run Code Online (Sandbox Code Playgroud)

当我运行执行简单await _mediator.Send(command);代码的REST端点时,我从日志中收到以下错误:

Error constructing handler for request of type MediatR.IRequestHandler`2[UniversityService.Application.Commands.AddEducationCommand,System.Boolean]. Register your handlers withthe container. See the samples in GitHub for examples.
Run Code Online (Sandbox Code Playgroud)

我试图通过文档中的官方示例查看,没有任何运气.有谁知道我如何配置MediatR正常工作?提前致谢.

ske*_*ske 13

我遇到了同样的问题.

问题是这个行代码

services.AddMediatR(typeof(AddEducationCommand).GetTypeInfo().Assembly);

处理所有MediatR IRequest和IRequestHandlers.

但是你创建了一个IRepository接口及其实现类,这是无法处理的 MediatR.Extensions.Microsoft.DependencyInjection

所以保留所有的更改,但添加这个 - 手动注册这样

services.AddScoped(typeof(IUniversityRepository), typeof(UniversitySqlServerRepository));

然后问题解决了.

  • 就我而言,InnerException 告诉我,我的依赖项无法找到其自己的特定版本的依赖项(例如,UniversitySqlServerRepository 找不到 Newtonsoft.Json)。 (3认同)

SU7*_*SU7 13

分享我对这个错误的个人经验,希望它可以避免其他人像我一样花几个小时挠头

我遇到了同样的问题并搜索了几个小时但没有找到,因为这个错误是一个非常普遍的错误。显然,它看起来像是 MediatR 问题,但通常情况并非如此。

我是怎么得出这个结论的?

为了获得原始异常,我打开了事件查看器应用程序,该应用程序默认存在于 Windows 中

custom Views > Summary Page Events我发现了一些与我的应用程序相对应的错误。在我的情况下,错误是这样的:

An error occured during migration

Exception: 
System.ArgumentNullException: Value cannot be null. (Parameter 'connectionString')
   at Microsoft.EntityFrameworkCore.Utilities.Check.NotEmpty(String value, String parameterName)
   at Microsoft.EntityFrameworkCore.MySqlDbContextOptionsExtensions.UseMySql(DbContextOptionsBuilder optionsBuilder, String connectionString, Action`1 mySqlOptionsAction)
Run Code Online (Sandbox Code Playgroud)

正如错误所说,connectionString是空的。最终我发现当我发布应用程序以获取 dll 时,appsettings.json它不在已发布的文件夹中,因此connectionString找不到,这就是迁移失败的原因。最终,应用程序因一个非常普遍的错误而崩溃:

Error constructing handler for request of type MediatR.IRequestHandler. 

Register your handlers with the container. See the samples in GitHub for examples
Run Code Online (Sandbox Code Playgroud)

我希望它可以帮助社区:)


Sal*_*ari 8

对我来说,不幸的是,其他解决方案都不起作用,因为我已经注册了所有内容。我的解决方案是将以下行添加到我的program.cs中:

.UseDefaultServiceProvider(options => options.ValidateScopes = false);
Run Code Online (Sandbox Code Playgroud)

所以该CreateHostBuilder方法将改为:

Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder.UseStartup<Startup>();
    }).UseDefaultServiceProvider(options =>
    options.ValidateScopes = false); // needed for mediatr DI
Run Code Online (Sandbox Code Playgroud)

实际上,这与“范围服务”有关,您可能会发现这个答案也相关。


Fra*_*iaz 5

我遇到了同样的问题,在我的情况下,当我在调用后注册某些处理程序所需的依赖项时,这services.AddMediatR()是实际问题,在我注册 Mediator 之前开始注册我的依赖项之后,一切正常。

我正在使用带有默认 DI 容器和 MediatR 6.0.0 的 dot net core 2.2。