本文介绍了使用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);

异常:

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的组件注册问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-15 17:51