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);
})