MediatR 多管道行为

MediatR Multiple Pipeline Behaviors

你好我已经将这种 Mediator CQRS 模式与管道行为一起使用了一段时间,但现在我遇到了一个问题,即 TResponse 和 TRequest 的通用实现还不够。所以我试图了解为两个非常具体的请求设置两个单独的管道是一种不好的做法还是一个坏主意。

所以主要思想是,让一个 PipelineBehavior 为 requestOne 执行特定逻辑,让另一个 PipelineBehavior 执行另一个不适用于请求的逻辑。

我不认为这是个坏主意,您可以创建一个接口来标记您想要实现 PipelineX 的所有请求,以及其他用于 PipelineY 的请求。

例如:
您有需要通过 PipelineX 的 RequestOne 和 RequestTwo 类,因此您创建和连接 IPipelineOne 并用它标记 类,然后使用反射在 pripeline 中间件内部进行处理。 PipelineY 仍将 运行 通过这两个 类 并且程序的其余部分也没有问题

不完全回答你的问题,如果你发现自己随着数量的增长而对行为注册感到困惑,你可以考虑使用我为此目的创建的库来指定它们 https://github.com/ITIXO/MediatR.Extensions.AttributedBehaviors

您可以构造多个具有不同行为的管道。

注册管道行为:

// pipeline 1's behaviors
services.AddScoped(typeof(IPipelineBehavior<,>), typeof(FooBehavior<,>));
services.AddScoped(typeof(IPipelineBehavior<,>), typeof(BarBehavior<,>));
services.AddScoped(typeof(IPipelineBehavior<,>), typeof(BazBehavior<,>));

// pipeline 2's behaviors
services.AddScoped(typeof(IPipelineBehavior<,>), typeof(CatBehavior<,>));
services.AddScoped(typeof(IPipelineBehavior<,>), typeof(DogBehavior<,>));
services.AddScoped(typeof(IPipelineBehavior<,>), typeof(PigBehavior<,>));

定义管道:

// pipeline 1
public interface IPipeline1 { }
public class FooBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> where TRequest : IPipeline1 { }
public class BarBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> where TRequest : IPipeline1 { }
public class BazBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> where TRequest : IPipeline1 { }

// pipeline 2
public interface IPipeline2 { }
public class CatBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> where TRequest : IPipeline2 { }
public class DogBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> where TRequest : IPipeline2 { }
public class PigBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> where TRequest : IPipeline2 { }

定义请求:

// requests to be processed by pipeline 1
public class ARequest : IRequest, IPipeline1 { }
public class BRequest : IRequest, IPipeline1 { }
public class CRequest : IRequest, IPipeline1 { }

// requests to be processed by pipeline 2
public class XRequest : IRequest, IPipeline2 { }
public class YRequest : IRequest, IPipeline2 { }
public class ZRequest : IRequest, IPipeline2 { }