5분 안에 MediatR

2747 단어 dotnetcsharpmediatr
내 자신의 이익을 위해 이것을 작성합니다... 업무를 위해 이것을 알아야 하므로 그것을 배우고 내 배움을 포착하고 싶었습니다.

5분 안에 MediatR을 수행하는 방법. 아주 기본적인 것들과 시작하는 방법.

왜 사용합니까?
복잡한 시스템에서 복잡성을 줄이기 위해. 다른 많은 클래스에 의존하는 클래스가 아니라 중재자 클래스(중재자 패턴 사용)는 쿼리 요청과 명령을 요청이나 명령을 제공하기 위해 적절한 클래스로 내보내 쿼리 요청과 명령을 처리합니다. 호출 클래스는 어떤 클래스가 그것을 처리하는지 알지 못합니다. 그들은 단지 그들이 무언가를 요청했고 그것이 반환/완료된다는 것을 압니다.

또한 코드가 CQRS(Command Query Responsibility Segregation) 아키텍처를 따를 수 있으므로 필요한 경우 읽기 또는 쓰기를 분리하고 확장할 수 있습니다. 예를 들어 목록에 대한 읽기 쿼리는 2분마다 업데이트되는 보고 서버에 액세스할 수 있지만 업데이트는 라이브 데이터베이스로 이동할 수 있습니다.

MediatR에는 훌륭한 파이프라인 동작 기능도 있습니다. 이를 통해 문제를 분리할 수 있으므로 유효성 검사 및 로깅과 같은 작업을 요청 처리기와 별도로(사전 또는 사후) 수행할 수 있습니다.

어떻게 사용합니까?
  • API 프로젝트에서 Nuget 패키지를 관리하고 MediatR.Extension.Microsoft.DependencyInjection을 추가합니다. 종속성이므로 MediatR NuGet 패키지도 추가됩니다.
  • API에서 명령, 쿼리 및 처리기에 대한 폴더 추가
  • 각 데이터 요청(쿼리) 또는 만들기/업데이트(명령)는 (C# 9.0 이상을 사용하는 경우) IRequest<return type> 인터페이스를 구현하는 레코드여야 합니다.

  • public record GetBankAccountsQuery() : IRequest<List<BankAccount>>
    


  • 각 요청에는 핸들러가 있어야 합니다. 핸들러는 IRequestHandler<request type, return type> 인터페이스를 구현하는 클래스입니다.

  • public class GetBankAccountsHandler() : IRequestHandler<GetBankAccountsQuery, List<BankAccount>>
    


  • 인터페이스를 마우스 오른쪽 버튼으로 클릭하고 "인터페이스 구현"을 선택합니다. 이렇게 하면 Handle 메서드가 생성됩니다. Handle 메서드 내에 코드를 입력하여 요청을 처리합니다. 데이터베이스 또는 파일의 데이터에 액세스합니다.
  • API의 ConfigureServices 메서드에서 서비스 컬렉션에 MediatR을 추가합니다: services.AddMediatR(typeof(any class where you have mediatr code e.g. a class that implements IRequest).Assembly) . .Assembly 부분을 사용하면 MediatR이 어셈블리를 살펴보고 IRequest 또는 IRequestHandler를 구현하는 모든 클래스를 찾고 이들 사이의 매핑을 설정할 수 있습니다.
  • 쿼리에서 반환된 값을 받아야 하는 코드(예: BankAccounts 목록에서 생성자에 대한 종속성으로 IMediator를 추가한 후 다음과 같은 코드를 수행합니다. var accounts = mediator.Send(GetBankAccountQuery);

  • 왜 사용하지 않습니까?

    애플리케이션이 여러 핸들러가 이벤트를 처리해야 하는 크기에 도달하면 NServiceBus 또는 MassTransit과 같은 메시지 처리 시스템으로 이동하는 것이 더 나을 수 있습니다.

    MediatR은 알림을 통해 이벤트당 여러 핸들러를 가질 수 있지만 동일한 프로세스에서 실행되므로 하나는 실패하고 다른 하나는 그렇지 않은 경우 재미있는 상태로 남게 됩니다. 핸들러가 실패했습니까?

    NServiceBus와 같은 메시지 기반 시스템을 사용하면 각 이벤트를 개별적으로 처리하고 발견한 오류에 응답할 수 있습니다. 예를 들어 BankAccount에서 결제하는 이벤트는 성공했지만 확인 이메일 전송 이벤트는 실패했다고 가정합니다. 음, 보내기 확인 이메일 이벤트를 다시 대기열에 넣고 이메일 서버가 백업될 때 다른 시간에 다시 시도하십시오. 한 부분이 실패했기 때문에 전체 이벤트를 실패할 필요가 없습니다.

    추상 MediatR?

    중재자 패턴의 구현을 실제로 추상화해야 합니다. 그래야 필요한 경우 코드를 손상시키지 않고 MediatR 이외의 다른 중재자 패키지를 사용할 수 있습니다.

    그러나... 여기에는 추가 코드와 복잡성이 필요합니다. 프로젝트가 작다면 그만한 가치가 없을 수도 있습니다. 예를 들어 확인 이메일만 보내는 작은 마이크로서비스. 나중에 쉽게 교체할 수 있는 이점과 배송 속도의 균형을 맞추십시오.

    좋은 웹페이지 즐겨찾기