@@ -0,0 +1,12 @@
|
||||
namespace TakeoutSaaS.Application.Messaging.Abstractions;
|
||||
|
||||
/// <summary>
|
||||
/// 领域事件发布抽象。
|
||||
/// </summary>
|
||||
public interface IEventPublisher
|
||||
{
|
||||
/// <summary>
|
||||
/// 发布领域事件。
|
||||
/// </summary>
|
||||
Task PublishAsync<TEvent>(string routingKey, TEvent @event, CancellationToken cancellationToken = default);
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
namespace TakeoutSaaS.Application.Messaging;
|
||||
|
||||
/// <summary>
|
||||
/// 事件路由键常量。
|
||||
/// </summary>
|
||||
public static class EventRoutingKeys
|
||||
{
|
||||
/// <summary>
|
||||
/// 订单创建事件路由键。
|
||||
/// </summary>
|
||||
public const string OrderCreated = "orders.created";
|
||||
|
||||
/// <summary>
|
||||
/// 支付成功事件路由键。
|
||||
/// </summary>
|
||||
public const string PaymentSucceeded = "payments.succeeded";
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
namespace TakeoutSaaS.Application.Messaging.Events;
|
||||
|
||||
/// <summary>
|
||||
/// 订单创建事件。
|
||||
/// </summary>
|
||||
public sealed class OrderCreatedEvent
|
||||
{
|
||||
/// <summary>
|
||||
/// 订单标识。
|
||||
/// </summary>
|
||||
public long OrderId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 订单编号。
|
||||
/// </summary>
|
||||
public string OrderNo { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 实付金额。
|
||||
/// </summary>
|
||||
public decimal Amount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 所属租户。
|
||||
/// </summary>
|
||||
public long TenantId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间(UTC)。
|
||||
/// </summary>
|
||||
public DateTime CreatedAt { get; init; }
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
namespace TakeoutSaaS.Application.Messaging.Events;
|
||||
|
||||
/// <summary>
|
||||
/// 支付成功事件。
|
||||
/// </summary>
|
||||
public sealed class PaymentSucceededEvent
|
||||
{
|
||||
/// <summary>
|
||||
/// 订单标识。
|
||||
/// </summary>
|
||||
public long OrderId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 支付流水号。
|
||||
/// </summary>
|
||||
public string PaymentNo { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 支付金额。
|
||||
/// </summary>
|
||||
public decimal Amount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 所属租户。
|
||||
/// </summary>
|
||||
public long TenantId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 支付时间(UTC)。
|
||||
/// </summary>
|
||||
public DateTime PaidAt { get; init; }
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using TakeoutSaaS.Application.Messaging.Abstractions;
|
||||
using TakeoutSaaS.Application.Messaging.Services;
|
||||
|
||||
namespace TakeoutSaaS.Application.Messaging.Extensions;
|
||||
|
||||
/// <summary>
|
||||
/// 消息模块应用层注册。
|
||||
/// </summary>
|
||||
public static class MessagingServiceCollectionExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// 注册事件发布器。
|
||||
/// </summary>
|
||||
public static IServiceCollection AddMessagingApplication(this IServiceCollection services)
|
||||
{
|
||||
services.AddScoped<IEventPublisher, EventPublisher>();
|
||||
return services;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
using TakeoutSaaS.Application.Messaging.Abstractions;
|
||||
using TakeoutSaaS.Module.Messaging.Abstractions;
|
||||
|
||||
namespace TakeoutSaaS.Application.Messaging.Services;
|
||||
|
||||
/// <summary>
|
||||
/// 事件发布适配器,封装应用层到 MQ 的发布。
|
||||
/// </summary>
|
||||
public sealed class EventPublisher(IMessagePublisher messagePublisher) : IEventPublisher
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public Task PublishAsync<TEvent>(string routingKey, TEvent @event, CancellationToken cancellationToken = default)
|
||||
=> messagePublisher.PublishAsync(routingKey, @event, cancellationToken);
|
||||
}
|
||||
Reference in New Issue
Block a user