Je suis actuellement en train de réorganiser certains grands contrôleurs dans notre application principale asp.net. Pour ce faire, nous avons choisi Mediatr et nous divisons actuellement ces grandes actions en gestionnaires & pré/post processeurs.Mediatr - Spécialisation pré/post-processeur
Certaines de nos commandes doivent déclencher un système de notification interne (service node.js). Pour ce faire, j'ai développé un post-processeur chargé de notifier le service événementiel. Cependant, je veux le "déclencher" uniquement pour les commandes héritant de l'interface INotify
. En d'autres termes, Mediatr charge tous les pré/post-processeurs mais il ne déclenche que ceux dont le type de commande correspond à la contrainte générique. En fin de compte, il ressemblerait à ceci:
public class NotificationPostProcessor<TCommand, TResponse> : IRequestPostProcessor<TCommand, TResponse>
where TCommand : >>INotifyCommand<<
where TResponse : CommandResult
{
(...)
}
Si la commande ne hérite pas de INotifyCommand alors ce post-processeur ne se déclenche pas.
Même chose pour les pré-processeurs. Par exemple, j'aurais besoin de mon pré-processeur pour ajouter des données supplémentaires à une commande spécifique.
Actuellement, ce que je fais est horrible et je suis sûr qu'il y a une meilleure façon.
public class NotificationPostProcessor<TCommand, TResponse> : IRequestPostProcessor<TCommand, TResponse>
where TCommand : IRequest<TResponse>
where TResponse : CommandResult
{
private readonly INotificationService _service;
public NotificationPostProcessor(INotificationService service)
{
_service = service;
}
public async Task Process(TCommand command, TResponse response)
{
var cmd = command as NotifyBaseCommand;
if (cmd != null && response.IsSuccess)
await _service.Notify(cmd.Event, command, response);
}
}
Depuis que je suis en utilisant le moteur d'injection de dépendance par défaut de base de asp.net + package MediatR.Extensions.Microsoft.DependencyInjection
, je ne suis pas enregistrer directement post & pré processeurs.
// Pipeline engine used internally to simplify controllers
services.AddMediatR();
// Registers behaviors
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(Pipeline<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(AuditBehavior<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(RequestPreProcessorBehavior<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(RequestPostProcessorBehavior<,>));
// Registers command validator
services.AddTransient(typeof(IValidator<RegisterUserCommand>), typeof(RegisterUserCommandValidator));
Je dois avouer que je suis un peu perdu ici. Une idée sur la façon dont je peux améliorer ce système?
Merci, Sébastien