当前位置: 首页 > 知识库问答 >
问题:

使用MediatR和Autofac的组件注册问题

蔺山
2023-03-14

我正在建立一个基于CQRS的系统。Net Core 2.1应用程序,使用Autofac和MediatR。

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);
        });

    }
}

当我将命令馈送给mediator时,它工作得非常好,命令处理程序上的Handle()被执行。

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);

例外情况:

未处理的异常:系统。InvalidOperationException:为MediatR类型的请求构造处理程序时出错。IRequestHandler2[Backend.MessageService.Commands.IdentifiedCommand2[Backend.MessageService.Commands.CreateMessageCommand,System.Boolean],系统。布尔值]。在容器中注册处理程序。有关示例,请参见GitHub中的示例---

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> {...}

我能知道少了什么吗?

共有2个答案

刘兴修
2023-03-14

添加这个解决了我的问题。

builder.RegisterType(typeof(IdentifiedCommandHandler<CreateMessageCommand, bool>))
    .As<IRequestHandler<IdentifiedCommand<CreateMessageCommand, bool>, bool>>()
    .AsImplementedInterfaces();
辛成周
2023-03-14

您发送给MediatR的命令类型为IdentifiedCommand

DI容器通常会通过首先查找精确匹配,然后考虑打开泛型类型注册来实现这一点。在本例中,它将查找IRequestHandler

为了使其工作,您必须以DI容器查找类型的方式实现该类型。因此,您必须实现IrecestHandler

不幸的是,这也意味着您不能使用类型安全的方式来接受标识命令

 类似资料:
  • 我当前的Autofac配置正在WebApi中解析我的APIController。 我正在努力的地方是,我试图创建一个具有通用构造函数参数的“BaseApiController”,但遇到了以下异常: 使用构造函数查找器“Autofac”,找不到类型为“Service”“1[WorldRegion]”的构造函数。果心激活剂。反射DefaultConstructorFinder’。 以下是代码结构: 工

  • 本文最初发表于博客园,并在GitHub上持续更新前端的系列文章。欢迎在GitHub上关注我,一起入门和进阶前端。 以下是正文。 前言 什么是组件 组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可。 模块化和组件化的区别 模块化:是从代码逻辑的角度进行划分的;方便代码分层开发,保证每个功能模块的职

  • 我是Autofac和 ASP.NET Core的相对较新的用户。我最近将一个小项目从一个“经典”ASP.NET WebAPI项目移植到 ASP.NET Core。我在Autofac上遇到了问题,特别是在泛型类型的注册方面。 该项目使用命令模式,每个命令处理程序都是封闭的泛型,如 这些命令处理程序被注入到控制器中,如下所示: Autofac(部分)配置为: 上面的内容似乎没有像预期的那样注册通用。如

  • 本文向大家介绍使用use注册Vue全局组件和全局指令的方法,包括了使用use注册Vue全局组件和全局指令的方法的使用技巧和注意事项,需要的朋友参考一下 Vue中的组件和指令分为局部组件、局部指令和全局组件、全局指令。对于注册有一定数量的全局指令和全局组件时,官方文档中的方法就显得有些不够清爽了。 全局组件 在Vue官方文档中介绍的是使用Vue.component(tagName, options)

  • 本文向大家介绍使用Python的Windows注册表访问(Winreg),包括了使用Python的Windows注册表访问(Winreg)的使用技巧和注意事项,需要的朋友参考一下 作为一种通用的语言,以及大量用户支持的模块的可用性,我们发现python在操作系统级别的编程方面也很擅长。在本文中,我们将看到python如何访问Windows操作系统的注册表。 我们需要将名为winreg的模块导入py

  • Autofac和其他容器的不同之处是它和C#语言的结合非常紧密,在使用过程中对你的应用的侵入性几乎为零,更容易与第三方的组件集成。 Autofac的主要特性如下: 灵活的组件实例化:Autofac支持自动装配,给定的组件类型Autofac自动选择使用构造函数注入或者属性注入,Autofac还 可以基于lambda表达式创建实例,这使得容器非常灵活,很容易和其他的组件集成。 var defaultL