using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; 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; /// /// WebSocket 传输服务注册扩展 /// 遵循依赖注入原则,注册所有组件 /// public static class WebSocketTransportExtensions { /// /// 添加 WebSocket 传输服务 /// /// 服务集合 /// 配置 /// 配置节名称 /// 服务集合 public static IServiceCollection AddWebSocketTransport( this IServiceCollection services, IConfiguration configuration, string configSection = "WebSocket") { // 注册配置 services.Configure(options => { configuration.GetSection(configSection).Bind(options); }); // 注册核心组件 services.AddSingleton(); services.AddSingleton(); // 注册消息通道管理器 services.AddSingleton(provider => { var logger = provider.GetRequiredService>(); var config = configuration.GetSection(configSection).Get() ?? new WebSocketConfig(); return new MessageChannelManager(logger, config.QueueCapacity, config.QueueCapacity, 100); }); // 注册 WebSocket 传输 services.AddSingleton(provider => { var logger = provider.GetRequiredService>(); var connection = provider.GetRequiredService(); var serializer = provider.GetRequiredService(); var middlewares = provider.GetServices(); var config = configuration.GetSection(configSection).Get() ?? new WebSocketConfig(); var channelManager = provider.GetRequiredService(); return new CoreAgent.WebSocketTransport.Services.WebSocketTransport(logger, connection, serializer, middlewares, config, channelManager); }); // 注册默认中间件 services.AddWebSocketMiddleware(); // services.AddWebSocketMiddleware(); services.AddScoped(provider => { var cache = provider.GetRequiredService(); var logger = provider.GetRequiredService>(); var config = provider.GetRequiredService>().Value; return new CacheMiddleware(cache, logger, config); }); return services; } /// /// 添加 WebSocket 传输服务(使用委托配置) /// /// 服务集合 /// 配置委托 /// 服务集合 public static IServiceCollection AddWebSocketTransport( this IServiceCollection services, Action configure) { // 注册配置 services.Configure(options => configure(options)); // 注册核心组件 services.AddSingleton(); services.AddSingleton(); // 注册消息通道管理器 services.AddSingleton(provider => { var logger = provider.GetRequiredService>(); var config = new WebSocketConfig(); configure(config); return new MessageChannelManager(logger, config.QueueCapacity, config.QueueCapacity, 100); }); // 注册 WebSocket 传输 services.AddSingleton(provider => { var logger = provider.GetRequiredService>(); var connection = provider.GetRequiredService(); var serializer = provider.GetRequiredService(); var middlewares = provider.GetServices(); var config = new WebSocketConfig(); configure(config); var channelManager = provider.GetRequiredService(); return new CoreAgent.WebSocketTransport.Services.WebSocketTransport(logger, connection, serializer, middlewares, config, channelManager); }); // 注册默认中间件 services.AddWebSocketMiddleware(); // services.AddWebSocketMiddleware(); services.AddScoped(provider => { var cache = provider.GetRequiredService(); var logger = provider.GetRequiredService>(); var config = provider.GetRequiredService>().Value; return new CacheMiddleware(cache, logger, config); }); return services; } /// /// 添加 WebSocket 中间件 /// /// 中间件类型 /// 服务集合 /// 服务集合 public static IServiceCollection AddWebSocketMiddleware(this IServiceCollection services) where T : class, IMessageMiddleware { services.AddScoped(); return services; } }