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));
然后问题解决了.
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)
我希望它可以帮助社区:)
对我来说,不幸的是,其他解决方案都不起作用,因为我已经注册了所有内容。我的解决方案是将以下行添加到我的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)
实际上,这与“范围服务”有关,您可能会发现这个答案也相关。
我遇到了同样的问题,在我的情况下,当我在调用后注册某些处理程序所需的依赖项时,这services.AddMediatR()是实际问题,在我注册 Mediator 之前开始注册我的依赖项之后,一切正常。
我正在使用带有默认 DI 容器和 MediatR 6.0.0 的 dot net core 2.2。
| 归档时间: |
|
| 查看次数: |
13352 次 |
| 最近记录: |