diff --git a/CoreAgent.API/Startup.cs b/CoreAgent.API/Startup.cs index 0559b2b..3c25d09 100644 --- a/CoreAgent.API/Startup.cs +++ b/CoreAgent.API/Startup.cs @@ -43,6 +43,9 @@ namespace CoreAgent.API // 添加网络命令配置 services.Configure(Configuration.GetSection("networkCommand")); + // 添加内存缓存服务(WebSocket中间件需要) + services.AddMemoryCache(); + // 添加 WebSocket 传输服务 services.AddWebSocketTransport(Configuration, "WebSocket"); } diff --git a/CoreAgent.WebSocketTransport/Extensions/WebSocketTransportExtensions.cs b/CoreAgent.WebSocketTransport/Extensions/WebSocketTransportExtensions.cs index 2f2ceb0..941a5d9 100644 --- a/CoreAgent.WebSocketTransport/Extensions/WebSocketTransportExtensions.cs +++ b/CoreAgent.WebSocketTransport/Extensions/WebSocketTransportExtensions.cs @@ -2,129 +2,121 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Microsoft.Extensions.Caching.Memory; using CoreAgent.WebSocketTransport.Interfaces; -using CoreAgent.WebSocketTransport.Models; using CoreAgent.WebSocketTransport.Services; using CoreAgent.WebSocketTransport.Middleware; -using Microsoft.Extensions.Caching.Memory; - -namespace CoreAgent.WebSocketTransport.Extensions; +using CoreAgent.WebSocketTransport.Models; -/// -/// WebSocket 传输服务注册扩展 -/// 遵循依赖注入原则,注册所有组件 -/// -public static class WebSocketTransportExtensions +namespace CoreAgent.WebSocketTransport.Extensions { /// - /// 添加 WebSocket 传输服务 + /// WebSocket 传输服务扩展 /// - /// 服务集合 - /// 配置 - /// 配置节名称 - /// 服务集合 - public static IServiceCollection AddWebSocketTransport( - this IServiceCollection services, - IConfiguration configuration, - string configSection = "WebSocket") + public static class WebSocketTransportExtensions { - if (services == null) - throw new ArgumentNullException(nameof(services)); - if (configuration == null) - throw new ArgumentNullException(nameof(configuration)); - - // 注册配置 - services.Configure(options => + /// + /// 添加 WebSocket 传输服务 + /// + /// 服务集合 + /// 配置 + /// 配置节名称 + /// 服务集合 + public static IServiceCollection AddWebSocketTransport( + this IServiceCollection services, + IConfiguration configuration, + string configSection = "WebSocket") { - configuration.GetSection(configSection).Bind(options); - }); + if (services == null) + throw new ArgumentNullException(nameof(services)); + if (configuration == null) + throw new ArgumentNullException(nameof(configuration)); - // 注册核心服务 - RegisterCoreServices(services); - - // 注册默认中间件 - RegisterDefaultMiddleware(services); - - return services; - } + // 注册配置 + services.Configure(options => + { + configuration.GetSection(configSection).Bind(options); + }); + // 注册默认中间件(在核心服务之前) + RegisterDefaultMiddleware(services); + // 注册核心服务 + RegisterCoreServices(services); - /// - /// 添加 WebSocket 中间件 - /// - /// 中间件类型 - /// 服务集合 - /// 服务集合 - public static IServiceCollection AddWebSocketMiddleware(this IServiceCollection services) - where T : class, IMessageMiddleware - { - if (services == null) - throw new ArgumentNullException(nameof(services)); + return services; + } - services.AddScoped(); - return services; - } + /// + /// 添加 WebSocket 中间件 + /// + /// 中间件类型 + /// 服务集合 + /// 服务集合 + public static IServiceCollection AddWebSocketMiddleware(this IServiceCollection services) + where T : class, IMessageMiddleware + { + if (services == null) + throw new ArgumentNullException(nameof(services)); - /// - /// 注册核心服务 - /// - /// 服务集合 - private static void RegisterCoreServices(IServiceCollection services) - { - // 注册核心组件 - services.AddSingleton(); - services.AddSingleton(); + services.AddScoped(); + return services; + } - // 注册消息通道管理器 - services.AddSingleton(provider => + /// + /// 注册核心服务 + /// + /// 服务集合 + private static void RegisterCoreServices(IServiceCollection services) { - var logger = provider.GetRequiredService>(); - var config = provider.GetRequiredService>().Value; - - return new MessageChannelManager( - logger, - config.QueueCapacity, - config.QueueCapacity, - 100); - }); + // 注册核心组件 + services.AddSingleton(); + services.AddSingleton(); - // 注册 WebSocket 传输 - services.AddSingleton(provider => - { - var logger = provider.GetRequiredService>(); - var connection = provider.GetRequiredService(); - var serializer = provider.GetRequiredService(); - var middlewares = provider.GetServices(); - var config = provider.GetRequiredService>().Value; - var channelManager = provider.GetRequiredService(); - - return new CoreAgent.WebSocketTransport.Services.WebSocketTransport( - logger, - connection, - serializer, - middlewares, - config, - channelManager); - }); - } + // 注册消息通道管理器 + services.AddSingleton(provider => + { + var logger = provider.GetRequiredService>(); + var config = provider.GetRequiredService>().Value; + + return new MessageChannelManager( + logger, + config.QueueCapacity, + config.QueueCapacity, + 100); + }); - /// - /// 注册默认中间件 - /// - /// 服务集合 - private static void RegisterDefaultMiddleware(IServiceCollection services) - { - // 注册日志中间件 - services.AddWebSocketMiddleware(); + // 注册 WebSocket 传输 + services.AddSingleton(provider => + { + var logger = provider.GetRequiredService>(); + var connection = provider.GetRequiredService(); + var serializer = provider.GetRequiredService(); + var middlewares = provider.GetServices(); + var config = provider.GetRequiredService>().Value; + var channelManager = provider.GetRequiredService(); + + return new CoreAgent.WebSocketTransport.Services.WebSocketTransport( + logger, + connection, + serializer, + middlewares, + config, + channelManager); + }); + } - // 注册缓存中间件(可选) - services.AddScoped(provider => + /// + /// 注册默认中间件 + /// + /// 服务集合 + private static void RegisterDefaultMiddleware(IServiceCollection services) { - var cache = provider.GetRequiredService(); - var logger = provider.GetRequiredService>(); - var config = provider.GetRequiredService>().Value; - return new CacheMiddleware(cache, logger, config); - }); + // 注册日志中间件 + services.AddWebSocketMiddleware(); + + // 注册缓存中间件(使用正确的注册方式) + services.AddWebSocketMiddleware(); + } } } \ No newline at end of file diff --git a/modify.md b/modify.md index 40af7ff..52772a9 100644 --- a/modify.md +++ b/modify.md @@ -472,4 +472,77 @@ - 调用方代码需要处理返回值 - 网络启动和停止流程的状态判断 - 日志记录详细程度提升 -- 错误处理和状态监控能力增强 \ No newline at end of file +- 错误处理和状态监控能力增强 + +### WebSocket传输服务依赖注入修复 + +**修改时间**: 2024年 +**修改文件**: +- `CoreAgent.WebSocketTransport/Extensions/WebSocketTransportExtensions.cs` +- `CoreAgent.API/Startup.cs` + +**修改内容**: + +1. **修复依赖注入顺序问题** + - 将 `RegisterDefaultMiddleware` 移到 `RegisterCoreServices` 之前调用 + - 确保中间件在核心服务注册之前就已经注册到容器中 + - 解决 `provider.GetServices()` 无法找到服务的问题 + +2. **修复CacheMiddleware注册方式** + - 将 `CacheMiddleware` 的注册方式从手动工厂方法改为使用 `AddWebSocketMiddleware` + - 简化注册逻辑,确保依赖注入容器能正确处理构造函数参数 + - 移除复杂的工厂方法注册,使用标准的依赖注入模式 + +3. **添加IMemoryCache服务注册** + - 在 `Startup.cs` 的 `ConfigureServices` 方法中添加 `services.AddMemoryCache()` + - 确保 `CacheMiddleware` 能够正确获取 `IMemoryCache` 依赖 + - 在 WebSocket 传输服务注册之前添加内存缓存服务 + +4. **具体实现**: + ```csharp + // WebSocketTransportExtensions.cs - 调整注册顺序 + public static IServiceCollection AddWebSocketTransport(...) + { + // 注册配置 + services.Configure(...); + + // 注册默认中间件(在核心服务之前) + RegisterDefaultMiddleware(services); + + // 注册核心服务 + RegisterCoreServices(services); + + return services; + } + + // Startup.cs - 添加内存缓存服务 + public void ConfigureServices(IServiceCollection services) + { + // ... 其他服务注册 ... + + // 添加内存缓存服务(WebSocket中间件需要) + services.AddMemoryCache(); + + // 添加 WebSocket 传输服务 + services.AddWebSocketTransport(Configuration, "WebSocket"); + } + ``` + +5. **设计优势**: + - **依赖顺序正确**:确保中间件在核心服务之前注册 + - **简化注册逻辑**:使用标准的依赖注入模式 + - **完整的服务注册**:包含所有必要的依赖服务 + - **错误预防**:避免运行时依赖注入异常 + - **代码清晰**:注册逻辑更加直观和易于理解 + +6. **修复的问题**: + - `System.InvalidOperationException: Cannot resolve scoped service 'System.Collections.Generic.IEnumerable`1[CoreAgent.WebSocketTransport.Middleware.IMessageMiddleware]' from root provider` + - 依赖注入容器无法找到 `IMessageMiddleware` 服务 + - `CacheMiddleware` 无法获取 `IMemoryCache` 依赖 + +**影响范围**: +- WebSocket传输服务的依赖注入配置 +- 中间件注册和初始化顺序 +- 应用程序启动时的服务注册 +- 内存缓存服务的可用性 +- 错误处理和异常预防 \ No newline at end of file