feat: finalize core modules and gateway

This commit is contained in:
2025-11-23 18:53:12 +08:00
parent 429d4fb747
commit ae273e510a
115 changed files with 4695 additions and 223 deletions

View File

@@ -0,0 +1,15 @@
using System.Threading;
using System.Threading.Tasks;
namespace TakeoutSaaS.Application.Messaging.Abstractions;
/// <summary>
/// 领域事件发布抽象。
/// </summary>
public interface IEventPublisher
{
/// <summary>
/// 发布领域事件。
/// </summary>
Task PublishAsync<TEvent>(string routingKey, TEvent @event, CancellationToken cancellationToken = default);
}

View File

@@ -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";
}

View File

@@ -0,0 +1,32 @@
namespace TakeoutSaaS.Application.Messaging.Events;
/// <summary>
/// 订单创建事件。
/// </summary>
public sealed class OrderCreatedEvent
{
/// <summary>
/// 订单标识。
/// </summary>
public Guid OrderId { get; init; }
/// <summary>
/// 订单编号。
/// </summary>
public string OrderNo { get; init; } = string.Empty;
/// <summary>
/// 实付金额。
/// </summary>
public decimal Amount { get; init; }
/// <summary>
/// 所属租户。
/// </summary>
public Guid TenantId { get; init; }
/// <summary>
/// 创建时间UTC
/// </summary>
public DateTime CreatedAt { get; init; }
}

View File

@@ -0,0 +1,32 @@
namespace TakeoutSaaS.Application.Messaging.Events;
/// <summary>
/// 支付成功事件。
/// </summary>
public sealed class PaymentSucceededEvent
{
/// <summary>
/// 订单标识。
/// </summary>
public Guid OrderId { get; init; }
/// <summary>
/// 支付流水号。
/// </summary>
public string PaymentNo { get; init; } = string.Empty;
/// <summary>
/// 支付金额。
/// </summary>
public decimal Amount { get; init; }
/// <summary>
/// 所属租户。
/// </summary>
public Guid TenantId { get; init; }
/// <summary>
/// 支付时间UTC
/// </summary>
public DateTime PaidAt { get; init; }
}

View File

@@ -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;
}
}

View File

@@ -0,0 +1,16 @@
using System.Threading;
using System.Threading.Tasks;
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);
}