Hola, ya uso este patrón de Mediator CQRS con Pipeline Behavior por un tiempo, pero ahora me enfrento a un problema en el que la implementación genérica de TResponse y TRequest no es suficiente. Entonces, estoy tratando de entender si tener dos canalizaciones separadas para dos solicitudes muy específicas es una mala práctica o una mala idea.
Entonces, la idea principal es tener un PipelineBehavior<RequestOne, ResponseOne> para hacer una lógica específica para requestOne y otro PipelineBehavior<RequestTwo, ResponseTwo> para hacer otra lógica que no se aplica a la solicitud.
No creo que sea mala idea en absoluto, puedes crear una interfaz para marcar todas las solicitudes que quieras implementar PipelineX, y otra para PipelineY.
Ex:
Tiene las clases RequestOne y RequestTwo que deben pasar por PipelineX, por lo que crea una interfaz como IPipelineOne y marca las clases con ella, luego usa la reflexión para procesar dentro del middleware pripeline. PipelineY aún se ejecutará a través de estas dos clases y el resto del programa también sin problemas.
No es exactamente una respuesta a su pregunta, pero si se confunde con los registros de comportamiento a medida que su número crece, puede considerar especificarlos usando la biblioteca que creé para ese propósitohttps://github.com/ITIXO/MediatR.Extensions.AttributedBehaviors
Puede construir varias canalizaciones con diferentes comportamientos.
Registrar comportamientos de tubería:
// 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<,>));Definir canalizaciones:
// 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 { }Definir solicitudes:
// 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 { }