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개의 μ’‹μ•„μš”