0

我有一个带有 Mediatr 3.0.1 和 structureMap.Microsoft.DependencyInjection 1.4.0 的 asp.net 核心 web api 项目。

我想使用预处理和后处理行为。IPipelineBehavior 按预期工作,但那些 2 没有:

public class PostProcessingBehavior<TRequest, TResponse> : IRequestPostProcessor<TRequest, TResponse>
{
    public Task Process(TRequest request, TResponse response)
    {
        LogTo.Info("Post processing: All Done");
        return Task.FromResult(0);
    }
}

public class PreProcessingBehavior<TRequest>: IRequestPreProcessor<TRequest>
{
    public Task Process(TRequest request)
    {
        // add validators here
        LogTo.Info("Pipline preprocessing happens");

        return Task.FromResult(0);
    }
}

容器注册:

private IServiceProvider ConfigureIoC(IServiceCollection services)
{
    var container = new Container();
    container.Configure(cfg =>
    {
        cfg.Scan(scanner =>
        {
            scanner.AssemblyContainingType(typeof(Startup));
            scanner.AssemblyContainingType(typeof(CustomerGetHandler));
            scanner.ConnectImplementationsToTypesClosing(typeof(IRequestHandler<>)); // Handlers with no response
            scanner.ConnectImplementationsToTypesClosing(typeof(IRequestHandler<,>)); // Handlers with a response
            scanner.ConnectImplementationsToTypesClosing(typeof(IAsyncRequestHandler<>)); // Async handlers with no response
            scanner.ConnectImplementationsToTypesClosing(typeof(IAsyncRequestHandler<,>)); // Async Handlers with a response
            scanner.ConnectImplementationsToTypesClosing(typeof(INotificationHandler<>));
            scanner.ConnectImplementationsToTypesClosing(typeof(IAsyncNotificationHandler<>));
            scanner.WithDefaultConventions();
        });

        cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(PreProcessingBehavior<>));
        cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(LoggingBehavior<,>));
        cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(PostProcessingBehavior<,>));

        cfg.For<SingleInstanceFactory>().Use<SingleInstanceFactory>(ctx => t => ctx.GetInstance(t)).ContainerScoped();
        cfg.For<MultiInstanceFactory>().Use<MultiInstanceFactory>(ctx => t => ctx.GetAllInstances(t)).ContainerScoped();
        cfg.For<IMediator>().Use<Mediator>();

        cfg.Populate(services);
    });

    return container.GetInstance<IServiceProvider>();
}

错误说:
ArgumentOutOfRangeException:指定的参数超出了有效值的范围。参数名称:具有 ReturnType PostProcessingBehavior 的实例“PostProcessingBehavior”不能转换为 IPipelineBehavior

这是来自示例: https ://github.com/jbogard/MediatR/blob/master/samples/MediatR.Examples.StructureMap/Program.cs

4

1 回答 1

3

查看您链接到的示例似乎混淆了接口。

您已经实施了IRequestPostProcessor&IRequestPreProcessor而不是IPipelineBehavior.

所以你应该注册到你正在实现的接口:

cfg.For(typeof(IRequestPreProcessor<>)).Add(typeof(PreProcessingBehavior<>));
cfg.For(typeof(IRequestPostProcessor<,>)).Add(typeof(PostProcessingBehavior<,>));

通过阅读文档,您可能还需要注册以下内容

cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(RequestPreProcessorBehavior<,>));
cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(RequestPostProcessorBehavior<,>));
于 2017-10-03T07:45:25.647 回答