前言 上一章主要通過MediatR進行職責分離,本章將通過MediatR使用訂閱發佈 Publish 此方法會將消息發佈到記憶體隊列,如果有任何訂閱者訂閱,此消息自行處理業務. 在我們開發中可能會存在一個場景,當我添加完某條數據或者說當我執行完一些操作後我需要進行發個郵件通知或者簡訊通知等等. Not ...
前言
上一章主要通過MediatR進行職責分離,本章將通過MediatR使用訂閱發佈
- Publish 此方法會將消息發佈到記憶體隊列,如果有任何訂閱者訂閱,此消息自行處理業務.
在我們開發中可能會存在一個場景,當我添加完某條數據或者說當我執行完一些操作後我需要進行發個郵件通知或者簡訊通知等等.
Notification
OrderCreatedEvent
所有的事件都需要繼承INotification介面
public class OrderCreatedEvent: INotification
{
public string UserId { get; set; }
public OrderCreatedEvent(string orderId)
{
this.UserId = orderId;
}
}
OrderCreatedDomainEventHandler在這其實可以進行實現廣播也就是實現多消費者去訂閱.所有消息處理器都需要繼承INotificationHandler介面
public class OrderCreatedDomainEventHandler :
INotificationHandler<OrderCreatedEvent>
{
private readonly ILogger _logger;
public OrderCreatedDomainEventHandler(ILogger<OrderCreatedDomainEventHandler> logger)
{
_logger = logger;
}
public Task Handle(OrderCreatedEvent notification, CancellationToken cancellationToken)
{
_logger.LogInformation($"Order has found by userid id: {notification.UserId} from publisher");
return Task.CompletedTask;
}
}
CreateOrderCommandHandler 通過我們的訂單處理器創建完訂單,通過Mediator進行發佈消息
public class CreateOrderCommandHandler
: IRequestHandler<CreateOrderRequestModel, string>
{
private readonly IMediator _mediator;
public CreateOrderCommandHandler(IMediator mediator)
{
this._mediator = mediator;
}
public async Task<string> Handle(CreateOrderRequestModel request, CancellationToken cancellationToken)
{
//do something...
await _mediator.Publish(new OrderCreatedEvent(request.UserId), cancellationToken);
return request.UserId;
}
}
Reference
https://github.com/hueifeng/BlogSample/tree/master/src/CQRSMediatR