fix: 租户端启动补齐字典与消息依赖

This commit is contained in:
root
2026-01-30 02:42:22 +00:00
parent f1963ae1a5
commit 8e315e4f17
5 changed files with 82 additions and 3 deletions

View File

@@ -17,8 +17,17 @@ public static class MessagingServiceCollectionExtensions
/// </summary>
public static IServiceCollection AddMessagingModule(this IServiceCollection services, IConfiguration configuration)
{
var rabbitMqSection = configuration.GetSection("RabbitMQ");
if (!rabbitMqSection.Exists())
{
services.AddSingleton<IMessagePublisher, NoOpMessagePublisher>();
services.AddSingleton<IMessageSubscriber, NoOpMessageSubscriber>();
return services;
}
// 1. (空行后) 存在 RabbitMQ 配置时才启用真实 MQ 能力(启动时验证配置完整性)
services.AddOptions<RabbitMqOptions>()
.Bind(configuration.GetSection("RabbitMQ"))
.Bind(rabbitMqSection)
.ValidateDataAnnotations()
.ValidateOnStart();

View File

@@ -0,0 +1,21 @@
using Microsoft.Extensions.Logging;
using TakeoutSaaS.Module.Messaging.Abstractions;
namespace TakeoutSaaS.Module.Messaging.Services;
/// <summary>
/// 空实现消息发布器:用于未配置 RabbitMQ 的开发/测试场景,避免启动依赖外部 MQ。
/// </summary>
public sealed class NoOpMessagePublisher(ILogger<NoOpMessagePublisher> logger) : IMessagePublisher
{
/// <inheritdoc />
public Task PublishAsync<T>(string routingKey, T message, CancellationToken cancellationToken = default)
{
logger.LogDebug(
"未配置 RabbitMQ已跳过消息发布RoutingKey={RoutingKey} MessageType={MessageType}",
routingKey,
typeof(T).FullName ?? typeof(T).Name);
return Task.CompletedTask;
}
}

View File

@@ -0,0 +1,25 @@
using Microsoft.Extensions.Logging;
using TakeoutSaaS.Module.Messaging.Abstractions;
namespace TakeoutSaaS.Module.Messaging.Services;
/// <summary>
/// 空实现消息订阅器:用于未配置 RabbitMQ 的开发/测试场景。
/// </summary>
public sealed class NoOpMessageSubscriber(ILogger<NoOpMessageSubscriber> logger) : IMessageSubscriber
{
/// <inheritdoc />
public Task SubscribeAsync<T>(string queue, string routingKey, Func<T, CancellationToken, Task<bool>> handler, CancellationToken cancellationToken = default)
{
logger.LogWarning("未配置 RabbitMQ消息订阅被禁用Queue={Queue} RoutingKey={RoutingKey}", queue, routingKey);
return Task.CompletedTask;
}
// 1. (空行后) 释放资源NoOp 实现无实际资源)
/// <inheritdoc />
public ValueTask DisposeAsync()
{
logger.LogDebug("NoOpMessageSubscriber 已释放。");
return ValueTask.CompletedTask;
}
}