Код IT
← Каталог

Паттерны проектирования — Кейс 1. Система уведомлений для интернет-магазина

Фрагмент из «Паттерны проектирования»: Кейс 1. Система уведомлений для интернет-магазина.

csharp projectencyclopedia7-06-proektirovanie-i-arhitektura-115 embed URL статья в энциклопедии
C# main.cs
// Domain event
public record OrderStatusChanged(OrderId Id, OrderStatus OldStatus, OrderStatus NewStatus);

// В агрегате Order
public void Ship() {
    if (Status != OrderStatus.Paid) throw new InvalidOperationException();
    var oldStatus = Status;
    Status = OrderStatus.Shipped;
    AddDomainEvent(new OrderStatusChanged(Id, oldStatus, Status));
}

// Обработчик события
public class NotificationHandler : IDomainEventHandler<OrderStatusChanged>
{
    private readonly IEmailService _email;
    private readonly ISmsService _sms;
    public Task Handle(OrderStatusChanged ev) {
        // Параллельно, с изоляцией ошибок
        _ = Task.Run(() => _email.Send(ev));
        _ = Task.Run(() => _sms.Send(ev));
        // Push — асинхронно через очередь
        _messageBus.Publish(new PushNotificationCommand(ev));
        return Task.CompletedTask;
    }
}
// Domain event
public record OrderStatusChanged(OrderId Id, OrderStatus OldStatus, OrderStatus NewStatus);

// В агрегате Order
public void Ship() {
    if (Status != OrderStatus.Paid) throw new InvalidOperationException();
    var oldStatus = Status;
    Status = OrderStatus.Shipped;
    AddDomainEvent(new OrderStatusChanged(Id, oldStatus, Status));
}

// Обработчик события
public class NotificationHandler : IDomainEventHandler<OrderStatusChanged>
{
    private readonly IEmailService _email;
    private readonly ISmsService _sms;
    public Task Handle(OrderStatusChanged ev) {
        // Параллельно, с изоляцией ошибок
        _ = Task.Run(() => _email.Send(ev));
        _ = Task.Run(() => _sms.Send(ev));
        // Push — асинхронно через очередь
        _messageBus.Publish(new PushNotificationCommand(ev));
        return Task.CompletedTask;
    }
}