MediatR 제거

MediatR 이 유료화를 앞두고 있어서, 패키지를 제거하고 있습니다.

이벤트, 파이프 파인 등의 기능 중에서 IRequest 의 구현 부분을 함수형으로 변경한 방법을 소개합니다.

기본 형식

namespace UseCases;

public interface IRequest;
public interface IRequest<TResponse>;

public delegate Task RequestHandler<TRequest>(TRequest request, CancellationToken token)  
   where TRequest : IRequest;

public delegate Task<TResponse> RequestHandler<TRequest, TResponse>(TRequest request, CancellationToken token)
   where TRequest : IRequest<TResponse>;

Requests

using UseCases.Students;

namespace UseCases.Students;

public record QueryStudentByName(string StudentName) 
   : IRequest<StudentDto[]>

public record StudentDto(string Name);

프론트 엔드

HttpClient 핸들러

namespace Usecases.ClientHandlers;

static class StudentCaseHandlers
{
   static readonly string _path = "/students";

   public RequestHandler<QuerySturentByName, StudentDto[]> QueryStudentByNameHandler(this HttpClient proxy) =>
      async (request, ct) =>
      {
          var path = $"{_path}?name={request.StudentName}";
          var response = await proxy.GetAsync(path, ct);
          return (await response.ReadFromJsonAsync<StudentDto[]>(ct)) ?? [];
      }

소비 코드

using Usecases.ClientHandlers;

var ct = // ...
var request = // ...
var students = await _httpClient.QueryStudentByNameHandler().Invoke(request, ct);

백엔드

데이터 베이스 핸들러

namespace Usecases.DBHandlers;

public static class EFCoreHandlers
{
   public RequestHandler<QueryStudentByName, StudentDto[]> QueryStudentByNameHandler(this DbContext db) =>
      async (request, ct) =>
      {
          return await db.Set<Student>()
            .Where(s => s.Name.Contains(request.StudentName))
            .Select(ToDto)
            .ToArrayAsync(ct);            
      }

소비 코드

using Usecases.DBHandlers;

app.MapGet("/students" async (string name, AppDbContext db, CancellationToken token) =>
{
   var request = new QueryStudentByName(name);
   return await db.QueryStudentByNameHandler().Invoke(request, token);
})

API 분리

Student 읽기 서비스.

using Usecases.DBHandlers;

app.MapGet("/students" async (string name, StudentQueryDbContext db, CancellationToken token) =>
{
   var request = new QueryStudentByName(name);
   return await db.QueryStudentByNameHandler().Invoke(request, token);
})
6개의 좋아요

헐 유료화 하나요 제 아키텍처의 기본인데 이게 유료할것인가 ㅠㅠ

3개의 좋아요

AutoMapper and MediatR Going Commercial - :eyeglasses: 읽을 거리 - 닷넷데브

요즘 참 말이 많습니다.

이 것 말고도 유사한 다른 패키지도 유료화할 예정인가 보더라구요.

2개의 좋아요

아니 근데 이게 유료화할 거리인가요 ㅠㅠ ;;;
prism 도 유료화 한다더니
아니 5년을 넘게 잘쓰던것을 갑자기
아키텍쳐가 유료화라니요 ㅠㅠ

3개의 좋아요

제작자가 혼자서 10년 넘게 관리하던 프로젝트라네요.
누구도 뭐라 할 수 없을 듯 합니다.

3개의 좋아요

참고로 MediatR is going commercial · jbogard/MediatR · Discussion #1105 · GitHub 에서 이번 결정에 관한 자세한 내용을 보실 수 있습니다.

1개의 좋아요