DotNET Console Generic Host - Event Driven With MediatR

2022. 9. 9. 00:00DOTNET/Generic Host

반응형

ASPNET Core 에서 모듈간의 의존성을 줄이기 위해서 Dependency Injection 과 MediatR 을 이용하였다. 

MediatR 은 Event Driven 방식의 programming 을 가능하게 하는 Event Process 의 구현 이다. 

dotnet core 에서는 이 MediatR 도 Console app 에서 사용가능 하다. 

물론 사용하기 위해서는 이전과 마찬가지로 Generic Host 가 필요하다.

 

이제 Console app 에서 Event Driven 방식을 사용하기 위해 MediatR 을 사용해 보자

 

설치

dotnet add package MediatR.Extensions.Microsoft.DependencyInjection

 

이제 Program.cs 로 이동하자

...
IHost host = Host.CreateDefaultBuilder(args)
        .ConfigureServices((hostContext, services) =>
        {
           ...
           services.AddMediatR(Assembly.GetExecutingAssembly());
           ...
        })
        
...

AddMediatR(Assembly.GetExecutingAssembly()); 

를 통해서 실행되는 Assembly 에서 자동으로 Handler 를 등록한다.

 

(예제는 이전 강좌에서 사용하던 GenericHost app 를 계속 이어서 작업합니다.)

 

Command/Add.cs

using MediatR;

namespace GenericHost.Command;
public class Add : IRequest<int>
{
    public int First { get; set; }
    public int Second { get; set; }
}

Handler/AddService.cs

using GenericHost.Command;
using MediatR;

namespace GenericHost.Handler;
public class AddService : IRequestHandler<Add, int>
{
    public Task<int> Handle(Add request, CancellationToken cancellationToken)
    {
        return Task.FromResult(request.First + request.Second);
    }
}

Worker.cs 수정

 ...
using GenericHost.Command;
using MediatR;
...
 
 private readonly IMediator _mediator;
 ...
 
 public Worker(
        ApiLogger logger,
        IHostApplicationLifetime appLifetime,
        IHelloworld helloworld,
        IConfiguration configuration,
        IMediator mediator) //<-- mediator 추가
    {
        _logger = logger;
        _helloworld = helloworld;
        _configuration = configuration;
        _mediator = mediator; // 할당
        appLifetime.ApplicationStarted.Register(OnStarted);
        appLifetime.ApplicationStopping.Register(OnStopping);
        appLifetime.ApplicationStopped.Register(OnStopped);
    }
    
    public async Task StartAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("1. StartAsync has been called.");
        await Init();
    }
    
    private async Task Init()
    {
        var command = new Add
        {
            First = 1,
            Second = 2
        };
        var result = await _mediator.Send(command);
        _logger.LogInformation($"Add {command.First} + {command.Second} = {result}");

    }

 

관련영상

https://youtu.be/0t-5uHFKN98

 

 

반응형