MediatR로 결합 코드 작성:중개 모드

나는 최근에 블로그 글을 써서 내가 가장 좋아하는 NuGet 패키지를 소개했다. My Top 4 NuGet Packages for ASP.NET Core그 게시물에서 나는 간략하게 MediatR이라는 가방을 소개했다.오늘 나는 이 문장으로 MediatR을 더욱 상세하게 복습할 것이다.

MediatR 소개


MediatR은 중개 모델의 실현이다.이것은 행위 소프트웨어 디자인 모델로 모든 구성 요소가'중개'대상을 통해 통신을 할 수 있도록 함으로써 서로 직접 통신하지 않고 더욱 간단한 코드를 구축하는 데 도움을 준다.이것은 코드가 고도의 결합을 유지하고 대상 간의 복잡한 의존 수량을 줄이는 데 도움이 된다.
조정 모델의 좋은 현실 예는 공항의 공중교통통제(ATC) 탑이다.만약 모든 비행기가 반드시 다른 비행기와 직접 통신해야 한다면 그것은 혼란스러울 것이다.반면 이들은 공중교통관제탑에 이 정보를 다른 비행기에 어떻게 전달할지 결정했다고 보고했다.이 장면에서 ATC 타워는 중개 대상이다.
MediatR 패키지를 사용하면 일부 데이터를 미디어터 객체로 보낼 수 있습니다.중개 대상에게 보내는 데이터 유형에 따라 어떤 다른 대상/서비스를 호출할지 결정합니다.MediatR 은
(917) 하나의 서비스 객체에만 요청을 보낼 수 있습니다.이 대상/서비스의 결과를 원시 호출자에게 되돌려줄 수 있습니다.
  • 알림 - 여러 객체/서비스에 메시지를 보낼 수 있습니다.어떤 데이터도 받아들일 수 없습니다.

  • MediatR 설정


    MediatR을 얻으려면 NuGet에서 패키지MediatR를 설치합니다.ASP NET Core를 사용하는 경우 MediatR.Extensions.Microsoft.DependencyInjection도 설치해야 합니다. 이것은 모든 MediaR 서비스를 등록하는 간단한 방법입니다.
    // Startup.cs
    public void ConfigureServices(IServiceCollection services)
    {
      // other services
    
      services.AddMediatR(typeof(Startup));
    }
    
    다른 의존항 주입 방법을 사용한다면 check the wiki 용기에 MediatR을 설정하는 방법을 알아보십시오.

    요청 보내기


    요청을 보내려면 요청과 요청 처리 프로그램 두 개의 대상을 만들어야 합니다.
    요청 대상은 IRequest 또는 IRequest<TResponse> 인터페이스를 실현해야 합니다. 이것은 데이터를 되돌려 주느냐에 따라 결정됩니다.요청 대상은 처리 프로그램에 보낼 데이터를 포함해야 합니다.
    public class AdditionRequest : IRequest<int>
    {
        public int A { get; set; }
        public int B { get; set; }
    }
    
    요청 처리 프로그램은 IRequestHandler<TRequest> 또는 IRequestHandler<TRequest, TResponse> 인터페이스를 실현해야 합니다. 이 중 TRequest는 사용자가 방금 만든 요청 대상입니다.
    public class AdditionRequestHandler : IRequestHandler<AdditionRequest, int>
    {
        public Task<int> Handle(AdditionRequest request, CancellationToken cancellationToken)
        {
            var result = request.A + request.B;
    
            return Task.FromResult(result);
        }
    }
    
    그리고 MediatR을 통해 요청을 보내려면 IMediator 실례에서send 방법을 사용하여 AdditionRequest 실례를 전달해야 한다.
    public class MyCalculator
    {
        private readonly IMediator _mediator;
    
        public MyCalculator(IMediator mediator)
        {
            _mediator = mediator;
        }
    
        public async Task<int> Add(int a, int b)
        {
            var request = new AdditionRequest { A = a, B = b };
            var result = await _mediator.Send(request);
    
            return result;
        }
    }
    
    요청 처리 프로그램에서 어떤 내용도 되돌려주지 않으려면 MediatR에 실제적으로 특수한 'nothing' 값이 있습니다. 이 값을 되돌려야 합니다. Unit라고 합니다.
    public class MyRequest : IRequest 
    {
        // some properties
    }
    
    public class MyRequestHandler : IRequestHandler<MyRequest>
    {
        public Task<Unit> Handle(MyRequest request, CancellationToken cancellationToken)
        {
            // do stuff
    
            return Task.FromResult(Unit.Value);
        }
    }
    

    알림 보내기


    알림을 보내는 것은 보내는 요청과 매우 비슷합니다. 알림 대상과 알림 처리 프로그램 대상을 만들어야 하기 때문입니다.이 차이점은 여러 개의 알림 처리 프로그램 대상을 만들 수 있으며, 알림이 MediatR에 전송될 때, 이 대상들은 모두 호출된다는 것이다.
    public class MyNotification : INotification
    {
        // some properties
    }
    
    public class MyNotificationHandler1 : INotificationHandler<MyNotification>
    {
        public Task Handle(MyNotification notification, CancellationToken cancellationToken)
        {
            // do stuff
    
            return Task.CompletedTask;
        }
    }
    
    public class MyNotificationHandler2 : INotificationHandler<MyNotification>
    {
        public Task Handle(MyNotification notification, CancellationToken cancellationToken)
        {
            // do stuff
    
            return Task.CompletedTask;
        }
    }
    
    그리고 실제 알림을 보내기 위해 IMediator 실례에서 Publish 방법으로 알림 대상을 전송하는 실례를 상향 조정한다.Publish를 호출하면 MyNotificationHandler1과 MyNotificationHandler2가 동시에 실행됩니다.
    public class MyService
    {
        private readonly IMediator _mediator;
    
        public MyService(IMediator mediator)
        {
            _mediator = mediator;
        }
    
        public async Task Execute()
        {
            var notification = new MyNotification
            {
                // initialise
            };
    
            await _mediator.Publish(notification);
        }
    }
    

    파이프 동작


    파이프 동작은 요청 전후에 실행되는 중간부품입니다. (요청만 지원하고 알림은 지원하지 않습니다.)로그 기록, 오류 처리, 검증 요청 등 다양한 작업에 사용할 수 있다.
    이러한 행위의 작업 방식은 중간부품의 작업 방식과 같다. 여러 행위를 연결해서 체인의 끝에 도달할 때까지 모든 행위를 순서대로 실행할 수 있다. 그리고 실제 요청 처리 프로그램을 실행한 다음 결과를 체인으로 전송할 수 있다.
    예를 들어, LoggingBehavior는 각 요청 전후에 애플리케이션 로그를 쓸 수 있습니다.
    public class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
    {
        private readonly ILogger<LoggingBehavior<TRequest, TResponse>> _logger;
    
        public LoggingBehavior(ILogger<LoggingBehavior<TRequest, TResponse>> logger)
        {
            _logger = logger;
        }
    
        public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
        {
            _logger.LogInformation($"Handling {typeof(TRequest).Name}");
    
            // go to the next behaviour in the chain/to the request handler
            var response = await next();
    
            _logger.LogInformation($"Handled {typeof(TResponse).Name}");
    
            return response;
        }
    }
    
    ASP NET Core에서 IoC 컨테이너에 각 Pipeline Behavior를 등록하려면 Startup 클래스의 Configure Services 방법에 다음 행을 추가합니다.
    services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehaviour<,>));
    
    기타 용기에 대해check the wiki.

    결론


    본고에서 저는 미디어터 모델과 NuGet 패키지 미디어R을 소개했는데 그 자체가 미디어터 모델의 실현입니다.요청 (일대일) 과 알림 (일대다) 을 보내는 방법, 모든 요청이 실행되기 전/이후에 실행되는 중간부품 (파이프 동작) 을 작성하는 방법을 보여 드렸습니다.
    "Ten++ Ways to Make Money as a Developer" eBook
    나의 게시물은 주로 무더기에 관한 것이다.NET 및 Vue 웹 개발어떤 댓글도 놓치지 않도록 본 블로그와subscribe to my newsletter를 주목해 주십시오.만약 당신이 이 문장이 매우 유용하다고 생각한다면, 좋아하고 공유해 주십시오.너도 돼.

    좋은 웹페이지 즐겨찾기