MediatR로 결합 코드 작성:중개 모드
17872 단어 csharpaspnetcoredotnetcoredotnet
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를 주목해 주십시오.만약 당신이 이 문장이 매우 유용하다고 생각한다면, 좋아하고 공유해 주십시오.너도 돼.
Reference
이 문제에 관하여(MediatR로 결합 코드 작성:중개 모드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/dr_sam_walpole/writing-decoupled-code-with-mediatr-the-mediator-pattern-34p5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
// other services
services.AddMediatR(typeof(Startup));
}
요청을 보내려면 요청과 요청 처리 프로그램 두 개의 대상을 만들어야 합니다.
요청 대상은
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를 주목해 주십시오.만약 당신이 이 문장이 매우 유용하다고 생각한다면, 좋아하고 공유해 주십시오.너도 돼.
Reference
이 문제에 관하여(MediatR로 결합 코드 작성:중개 모드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/dr_sam_walpole/writing-decoupled-code-with-mediatr-the-mediator-pattern-34p5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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;
}
}
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를 주목해 주십시오.만약 당신이 이 문장이 매우 유용하다고 생각한다면, 좋아하고 공유해 주십시오.너도 돼.
Reference
이 문제에 관하여(MediatR로 결합 코드 작성:중개 모드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/dr_sam_walpole/writing-decoupled-code-with-mediatr-the-mediator-pattern-34p5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(MediatR로 결합 코드 작성:중개 모드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/dr_sam_walpole/writing-decoupled-code-with-mediatr-the-mediator-pattern-34p5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)