MediatR
MediatR 패키지는 메시지 전송과 처리를 분리하기 위해 만들어진 중재자 패턴의 .NET 구현체입니다.
MediatR 패키지 설치
Install-Package MediatR
MediatR 사용 설정
Program.cs 파일에 다음 코드를 사용합니다.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddMediatR(Assembly.GetExecutingAssembly());
builder.Services.AddSingleton<WeatherForecastService>();
요청 및 응답
다음 내용은 MediatR 공식 사이트의 내용을 참고하였습니다.
요청 및 응답 인터페이스는 명령 및 쿼리 시나리오를 모두 처리합니다. 먼저 메시지를 작성합니다.
public class Ping : IRequest<string> { }
다음으로 처리기를 만듭니다.
public class PingHandler : IRequestHandler<Ping, string>
{
public Task<string> Handle(Ping request, CancellationToken cancellationToken)
{
return Task.FromResult("Pong");
}
}
마지막으로 중재자를 통해 메시지를 보냅니다.
var response = await mediator.Send(new Ping());
Debug.WriteLine(response); // "Pong"
메시지에 응답이 필요하지 않은 경우 AsyncRequestHandler<TRequest>
기본 클래스 를 사용하십시오.
public class OneWay : IRequest { }
public class OneWayHandlerWithBaseClass : AsyncRequestHandler<OneWay>
{
protected override Task Handle(OneWay request, CancellationToken cancellationToken)
{
// Twiddle thumbs
}
}
또는 요청이 완전히 동기식인 경우 기본 RequestHandler클래스에서 상속합니다.
public class SyncHandler : RequestHandler<Ping, string>
{
protected override string Handle(Ping request)
{
return "Pong";
}
}
요청 유형
MediatR에는 값을 반환하는 요청과 반환하지 않는 요청의 두 가지 유형이 있습니다.
IRequest<T>
- 요청은 값을 반환합니다.IRequest
- 요청이 값을 반환하지 않음
실행 파이프라인을 단순화하기 위해 여기서 IRequest
상속은 터미널/무시된 반환 유형을 나타냅니다. IRequest<Unit>Unit
각 요청 유형에는 자체 처리기 인터페이스와 일부 도우미 기본 클래스가 있습니다.
IRequestHandler<T, U>
- 이것을 구현하고 반환Task<U>
RequestHandler<T, U>
- 이것을 상속하고 반환
그런 다음 반환 값이 없는 요청의 경우:
IRequestHandler<T>
- 이것을 구현하면 돌아올 것Task<Unit>
입니다.AsyncRequestHandler<T>
- 이것을 상속하면 돌아올 것Task
입니다.RequestHandler<T>
- 이것을 상속하면 아무 것도 반환하지 않습니다( void).
스트림 및 AsyncEnumerables
요청에서 스트림을 만들려면 먼저 스트림 요청과 해당 응답을 구현합니다.
IStreamRequest<TResponse>
스트림 요청 핸들러는 일반적인 것과는 별개 IRequestHandler
이며 구현이 필요합니다.
IStreamRequestHandler<TRequest, TResponse>
단일을 반환하는 일반 요청 핸들러와 달리 TResponse
스트림 핸들러는 다음을 반환합니다 IAsyncEnumerable<TResponse>
.
IAsyncEnumerable<TResponse> Handle(TRequest request, CancellationToken cancellationToken);
스트림 요청 처리기를 만들려면 IStreamRequestHandler<TRequest, TResponse>
위의 Handle 메서드를 구현하고 구현하는 클래스를 만듭니다.
알림
알림의 경우 먼저 알림 메시지를 만듭니다.
public class Ping : INotification { }
다음으로 알림에 대해 0개 이상의 핸들러를 만듭니다.
public class Pong1 : INotificationHandler<Ping>
{
public Task Handle(Ping notification, CancellationToken cancellationToken)
{
Debug.WriteLine("Pong 1");
return Task.CompletedTask;
}
}
public class Pong2 : INotificationHandler<Ping>
{
public Task Handle(Ping notification, CancellationToken cancellationToken)
{
Debug.WriteLine("Pong 2");
return Task.CompletedTask;
}
}
마지막으로 중재자를 통해 메시지를 게시합니다.
await mediator.Publish(new Ping());