Mediator

 서론

Dependency Injection 을 이용하여 의존성 문제를 해결 하였으나 그것만으로는 부족할 수 있다. library 간의 강결합을 해결 하기 위한 Event mechanism 이 필요하다. 
Observer, Event Bus, Event Aggregator  등

  






MediatR 이라는 Mediator 를 구현한 library 를 이용해 보자



설치

dotnet add package MediatR.Extensions.Microsoft.DependencyInjection



초기설정

Program.cs 로 이동 아래 추가

builder.Services.AddMediatR(AssemblyHelper.GetAllAssemblies().ToArray());

AssemblyHelper.cs 추가

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class AssemblyHelper
{
    public static List<Assembly> GetAllAssemblies(SearchOption searchOption = SearchOption.TopDirectoryOnly)
    {
        List<Assembly> assemblies = new List<Assembly>();

        foreach (string assemblyPath in Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll", searchOption))
        {
            try
            {
                var assembly = System.Runtime.Loader.AssemblyLoadContext.Default.LoadFromAssemblyPath(assemblyPath);
                assemblies.Add(assembly);
            }
            catch (Exception e)
            {
                Debug.WriteLine(e.ToString());
            }

        }

        return assemblies;
    }
}


Ping.cs (Command 작성)
1
public class Ping : IRequest<string> { }


PingHandlelr.cs (Handler 작성)
1
2
3
4
5
6
7
public class PingHandler : IRequestHandler<Ping, string>
{
    public Task<string> Handle(Ping request, CancellationToken cancellationToken)
    {
        return Task.FromResult("Pong");
    }
}


Controller 에 method 추가
1
2
3
4
5
[HttpGet("ping")]
public async Task<string> SendPing([FromServices]IMediator mediator)
{
    return await mediator.Send(new Ping());
}

실행 및 Test



관련 영상

댓글

이 블로그의 인기 게시물

ASPNET 6 Web Api Basic Tutorial 1 / 2 (Swagger, SeriLog, MediatR, EntityFrameworkCore, Scrutor)

Dependency Injection Customization