MediatR

  • 3 minutes to read

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());
VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com