Component registration issue using MediatR and Autofac(使用MediatR和AutoFace的组件注册问题)
本文介绍了使用MediatR和AutoFace的组件注册问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在使用Autofac和MediatR构建一个基于CQRS的.Net Core 2.1应用程序。
public class MediatorModule : Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterAssemblyTypes(typeof(IMediator).GetTypeInfo().Assembly).AsImplementedInterfaces();
var mediatrOpenTypes = new[]
{
typeof(IRequestHandler<,>),
typeof(INotificationHandler<>),
};
foreach (var mediatrOpenType in mediatrOpenTypes)
{
builder
.RegisterAssemblyTypes(typeof(CreateMessageCommand.GetTypeInfo().Assembly)
.AsClosedTypesOf(mediatrOpenType)
.AsImplementedInterfaces();
}
builder.RegisterGeneric(typeof(RequestPostProcessorBehavior<,>)).As(typeof(IPipelineBehavior<,>));
builder.RegisterGeneric(typeof(RequestPreProcessorBehavior<,>)).As(typeof(IPipelineBehavior<,>));
builder.Register<ServiceFactory>(ctx =>
{
var c = ctx.Resolve<IComponentContext>();
return t => c.Resolve(t);
});
}
}
当我将命令提供给中介程序时,它工作得非常好,并且命令处理程序上的句柄()得到执行。
var cmd = new CreateMessageCommand("Foo")
_mediator.Send(cmd)
如果我这样执行,事情就不太顺利
var cmd = new CreateMessageCommand("Foo")
var req = new IdentifiedCommand<CreateMessageCommand, bool>(cmd, @event.Id);
await _mediator.Send(req);
异常:
未处理的异常:系统。无效操作异常:为类型为MediatR.IRequestHandler2[Backend.MessageService.Commands.IdentifiedCommand
2[Backend.MessageService.Commands.CreateMessageCommand,的请求构造处理程序时出错],系统。布尔]。向容器注册您的处理程序。有关示例,请参阅GitHub中的示例。->Autofac.Core.Registration.ComponentNotRegisteredException:请求的服务‘MediatR.IRequestHandler2[[Backend.MessageService.Commands.IdentifiedCommand
2[[Backend.MessageService.Commands.CreateMessageCommand,Backend.MessageService,版本=1.0.0.0,区域性=中性,PublicKeyToken=NULL],[系统.Boolean,System.Private.CoreLib,版本=4.0.0.0,区域性=中性,PublicKeyToken=7cec85d7bea7798e]],Backend.MessageService,版本=1.0.0.0,区域性=中性,PublicKeyToken=NULL],[系统.Boolean,System.Private.CoreLib,版本=4.0.0.0,文化=中性,PublicKeyTokyen=7cec85d7bea7798e]尚未注册。若要避免此异常,请注册组件以提供服务,使用IsRegisted()检查服务注册,或使用ResolveOptional()方法解析可选依赖项。
public class IdentifiedCommand<T, R> : IRequest<R>
where T : IRequest<R>
{
public T Command { get; }
public Guid Id { get; }
public IdentifiedCommand(T command, Guid id)
{
Command = command;
Id = id;
}
}
public class IdentifiedCommandHandler<T, R> :
IRequestHandler<IdentifiedCommand<T, R>, R>
where T : IRequest<R> {...}
我可以知道丢失了什么吗?
推荐答案
添加此选项解决了我的问题。
builder.RegisterType(typeof(IdentifiedCommandHandler<CreateMessageCommand, bool>))
.As<IRequestHandler<IdentifiedCommand<CreateMessageCommand, bool>, bool>>()
.AsImplementedInterfaces();
这篇关于使用MediatR和AutoFace的组件注册问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:使用MediatR和AutoFace的组件注册问题
基础教程推荐
猜你喜欢
- rabbitmq 的 REST API 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01
- c# Math.Sqrt 实现 2022-01-01
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30
- 如何激活MC67中的红灯 2022-01-01
- SSE 浮点算术是否可重现? 2022-01-01
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01
- 将 XML 转换为通用列表 2022-01-01