CQRS MediatR中介者模式


CQRS MediatR中介者模式,这个讲的非常明白怎么用

MediatR
Install MediatR

PM> Install-Package MediatR

IMeditator
IRequese、IRequest
IRequestHandler

public class CreateOrderRequestModel:IRequest<string>
{
  public string UserId { get; set; }
  public string CardNumber { get; set; }
}
public class GetOrderByIdRequestModel:IRequest<string>
{
   public string OrderId { get; set; }
}
//返回值
public interface IRequest<out TResponse> : IBaseRequest{}
//无返回值
public interface IRequest : IRequest, IBaseRequest{}



创建处理程序,所有的处理程序都通过IRequestHandler接口来实现,该接口有两个参数,第一个是请求内容,第二个是响应内容.

public class CreateOrderCommandHandler: IRequestHandlerstring>
{
  public Task<string> Handle(CreateOrderRequestModel request, CancellationToken cancellationToken)
  {
    //do something...
    return Task.FromResult(request.UserId);
  }
}

正如下代码片段,处理程序实现了IRequestHandler带有输入和输出类型定义的接口

public interface IRequestHandler<in TRequest, TResponse> where TRequest : IRequest
{
   Task Handle(TRequest request, CancellationToken cancellationToken);
}

public class GetOrderByIdQueryHandler :IRequestHandlerstring>
{
   public Task<string> Handle(GetOrderByIdRequestModel request, CancellationToken cancellationToken)
   {
     //do something
     return Task.FromResult(request.OrderId);
    }
}



Install MediatR.Extensions.Microsoft.DependencyInjection

PM> MediatR.Extensions.Microsoft.DependencyInjection

在Startup.cs中注册MediatR

services.AddMediatR(Assembly.GetExecutingAssembly());

我们只需要注入IMediator接口,通过如下代码我们来使用他们

[Route("api/[controller]")]
[ApiController]
public class OrderController : ControllerBase
{
   private readonly IMediator _mediator;
   public OrderController(IMediator mediator)
   {
      _mediator = mediator;
    }

   [HttpPost]
   public async Task Post([FromBody]CreateOrderRequestModel requestModel)
   {
       var response =await _mediator.Send(requestModel);
        return Ok(response);
    }

   [HttpGet]
   public async Task Get([FromQuery]GetOrderByIdRequestModel requestModel)
   {
       var response = await _mediator.Send(requestModel);
       return Ok(response);
    }
}

参考:https://blog.csdn.net/qq_27843785/article/details/105403630