Mediatr 管道行为注册
Mediator pipline behaviors registration
我有一个 asp.net 核心网络 api 项目,带有 Mediatr 3.0.1 和 structureMap.Microsoft.DependencyInjection 1.4.0。
我想使用预处理和 post 处理行为。
IPipelineBehavior 按预期工作,但 thoese 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
查看您链接到的示例,您似乎混淆了接口。
您实施的是 IRequestPostProcessor
& IRequestPreProcessor
而不是 IPipelineBehavior
。
所以你应该注册到你正在实现的接口:
cfg.For(typeof(IRequestPreProcessor<>)).Add(typeof(PreProcessingBehavior<>));
cfg.For(typeof(IRequestPostProcessor<,>)).Add(typeof(PostProcessingBehavior<,>));
阅读documentation,您可能还需要注册以下内容
cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(RequestPreProcessorBehavior<,>));
cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(RequestPostProcessorBehavior<,>));
我有一个 asp.net 核心网络 api 项目,带有 Mediatr 3.0.1 和 structureMap.Microsoft.DependencyInjection 1.4.0。
我想使用预处理和 post 处理行为。 IPipelineBehavior 按预期工作,但 thoese 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
查看您链接到的示例,您似乎混淆了接口。
您实施的是 IRequestPostProcessor
& IRequestPreProcessor
而不是 IPipelineBehavior
。
所以你应该注册到你正在实现的接口:
cfg.For(typeof(IRequestPreProcessor<>)).Add(typeof(PreProcessingBehavior<>));
cfg.For(typeof(IRequestPostProcessor<,>)).Add(typeof(PostProcessingBehavior<,>));
阅读documentation,您可能还需要注册以下内容
cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(RequestPreProcessorBehavior<,>));
cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(RequestPostProcessorBehavior<,>));