2017-02-15 2 views
1

Ich benutze ASP.NET Core, die neueste MediatR und MediatR extension for Core's DI.Wie kann ich einen MediatR-Pipeline-Handler für ASP.NET Core registrieren und verwenden?

Ich versuche, eine Pipeline mit Validierung, using the official blog post einzurichten. Das Beispiel is here.

Ich verstehe nicht, wie diese Pipeline-Klasse zu registrieren/zu verwenden. Eine andere blog post zeigt, wie dies zu tun ist, aber ich denke, es ist für AutoFac.

Wie mache ich das für den eingebauten Container?

Antwort

6

Die von Ihnen erwähnten Beiträge verwenden MediAtR 2.x.
MediatR 3.0 wurde vor kurzem veröffentlicht und hat eine integrierte Unterstützung für Pipelines. Ich würde vorschlagen, dass Sie die associated documentation lesen.

Kurz gesagt, MediatR macht nun eine IPipelineBehavior<TRequest, TResponse> verfügbar, und die Instanzen, die Sie in Ihrem Container registrieren, werden automatisch von MediatR entdeckt, wenn Sie den Handler erstellen.

Hier ist, wie es in ASP.NET-Core aussehen könnte:

public class MyRequest : IRequest<string> 
{ 
} 

public class MyRequestHandler : IRequestHandler<MyRequest, string> 
{ 
    public string Handle(MyRequest message) 
    { 
     return "Hello!"; 
    } 
} 

public class TracingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> 
{ 
    public async Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next) 
    { 
     Trace.WriteLine("Before"); 
     var response = await next(); 
     Trace.WriteLine("After"); 

     return response; 
    } 
} 

Sehr einfach, eine Anforderung, ein Handler und ein Verhalten, das einige „Protokollierung“ der Fall ist.

Die Registrierung ist sehr einfach, auch:

var services = new ServiceCollection(); 
services.AddMediatR(typeof(Program)); 
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(TracingBehaviour<,>)); 
var provider = services.BuildServiceProvider(); 

var mediator = provider.GetRequiredService<IMediator>(); 

var response = await mediator.Send(new MyRequest()); 

Es ist nur eine Frage der Open-generic TracingBehavior als generische Implementierung von IPipelineBehavior Registrierung.

+0

Ich bin gespannt, wie der Handler mit der Pipeline verbunden wird, weil ich es gerade ausprobiert habe und es automatisch funktioniert! – grokky

+1

MediatR macht es intern. Sie löst den Request-Handler über Ihren Container auf, löst dann alle Instanzen von "IPipelineBehavior" auf und erstellt eine Pipeline, in der alle Verhalten verkettet sind und das letzte Element in der Kette der eigentliche Handler ist. Es geschieht alles in der Klasse [RequestHandlerImpl '] (https://github.com/jbogard/Mediatr/blob/bead0c683b8a001e2f796a623e04b1b333ca702c/src/MediaR/Internal/RequestHandler.cs#L64), wenn Sie interessiert sind beim Lesen des Codes. –

+0

Ich habe gerade festgestellt, dass die obige Pipeline für ALLE Anfragen aufgerufen werden würde. Soll es so sein? Kann ich nicht mehrere Pipelines haben und zum Beispiel einen für die Validierung haben, wo nur bestimmte Anfragen verarbeitet werden und nicht alle Anfragen? – grokky

Verwandte Themen