ChainRunner를 사용하여 C#에서 책임/명령 체인 구현

저는 사용자의 의견을 담당하는 ASP.NET Core Web API 응용 프로그램을 작업하고 있습니다. 응용 프로그램은 새로운 의견을 받고 여러 비즈니스 기준에 따라 거부 또는 검열 여부를 결정합니다. 간단히 말해서 각각의 새 댓글은 다음 단계를 거쳐야 합니다.
  • 저주 단어 검열
  • 잘못된 단어 수정
  • 부적절한 톤이 있는 경우 거부

  • 단계는 그렇게 복잡하지 않으며 순차적으로 실행되어야 합니다. 이 단계를 구현하기 위해 chain of responsibility pattern으로 이동하기로 결정했습니다. 하지만 이 패턴을 구현하기 위한 간단하고 적절한 라이브러리를 찾을 수 없었기 때문에 이 모든 작업을 수행하기 위해 ChainRunner이라는 라이브러리를 만들었습니다.



    그림은 ChainRunner의 작동 방식을 보여줍니다.

    구현



    아래에서 ChainRunner를 사용하여 단계를 구현한 방법을 확인할 수 있습니다. 각 단계마다 담당 핸들러를 만들었습니다.

    public class CensorCurseWordsHandler : IResponsibilityHandler<Comment>
    {
        public Task HandleAsync(Comment request, CancellationToken cancellationToken = default)
        {
            // process comment ...
        }
    }
    
    public class ModifyIncorrectWordsHandler : IResponsibilityHandler<Comment>
    {
        public Task HandleAsync(Comment request, CancellationToken cancellationToken = default)
        {
            // process comment ...
        }
    }
    
    public class ImproperToneHandler : IResponsibilityHandler<Comment>
    {
        public Task HandleAsync(Comment request, CancellationToken cancellationToken = default)
        {
            // process comment ...
        }
    }
    
    


    그런 다음 Startup.cs(ASP.NET Core)에서 체인을 구성했습니다.

    services.AddChain<Comment>()
            .WithHandler<CensorCurseWordsHandler>()
            .WithHandler<ModifyIncorrectWordsHandler>()
            .WithHandler<ImproperToneHandler>();
    


    마지막으로 클래스에 체인을 주입하고 다음과 같이 체인을 실행했습니다.

    
    [ApiController]
    [Route("[controller]")]
    public class CommentController
    {
        private readonly IChain<Comment> _chain;
    
        public CommentController(IChain<Comment> chain)
        {
            _chain = chain;
        }
    
        [HttpPost]
        public async Task<IActionResult> Post(Comment comment)
        {
            await _chain.RunAsync(comment);
    
            return Ok();
        }
    }
    


    연결


  • GitHub
  • NuGet
  • 좋은 웹페이지 즐겨찾기