2017-07-19 2 views
0

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

Répondre

0

Apparemment noyau ASP.net DI ne supporte pas cette fonctionnalité.

SRC: Support constrained open generic types

Il a travaillé avec Autofac. Je devais juste ajouter une seule ligne de code :)

var host = new WebHostBuilder() 
     .UseKestrel() 
     .ConfigureServices(services => services.AddAutofac()) 
     .UseContentRoot(Directory.GetCurrentDirectory()) 
     .UseIISIntegration() 
     .UseStartup<Startup>() 
     .UseApplicationInsights() 
     .Build();