2017-10-03 3 views
0

J'ai un projet api web core asp.net avec Mediatr 3.0.1 et structureMap.Microsoft.DependencyInjection 1.4.0.Enregistrement des comportements de pipline Mediator

Je voudrais utiliser le comportement de pré-traitement et de post-traitement. Le IPipelineBehavior fonctionne comme prévu, mais thoese 2 ne:

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); 
    } 
} 

enregistrement Container:

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>(); 
} 

L'erreur dit:
ArgumentOutOfRangeException: Argument spécifié était hors de la plage de valeurs valides. Nom du paramètre: par exemple « PostProcessingBehavior » avec ReturnType PostProcessingBehavior ne peut pas être jeté à IPipelineBehavior

c'est l'exemple: https://github.com/jbogard/MediatR/blob/master/samples/MediatR.Examples.StructureMap/Program.cs

Répondre

1

En regardant l'exemple que vous avez lié à vous semblez avoir confondu les interfaces.

Vous avez mis en œuvre IRequestPostProcessor & IRequestPreProcessor et non IPipelineBehavior.

Vous devez donc enregistrerons aux interfaces que vous implémentez:

cfg.For(typeof(IRequestPreProcessor<>)).Add(typeof(PreProcessingBehavior<>)); 
cfg.For(typeof(IRequestPostProcessor<,>)).Add(typeof(PostProcessingBehavior<,>)); 

À la lecture du documentation, vous devrez peut-être enregistrer les informations suivantes

cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(RequestPreProcessorBehavior<,>)); 
cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(RequestPostProcessorBehavior<,>)); 
+0

ok je comprends quelque chose tout à fait tort ici . c'est logique maintenant. Merci. J'ai seulement ajouté votre premier code, mais rien ne se passe dans les pré et post-processeurs. et la phrase avec "registre Pré et Post Processors Behavior comme IPipleline Behavior" n'est pas comment je le comprenais – Andre