using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System.Extensions; using System.Net.WebSockets; namespace System.Net.Http; public sealed class ClientWebSocketBuilder { private readonly IServiceCollection services; private ClientWebSocket? innerWebSocket; private Func? innerWebSocketFactory; internal ClientWebSocketBuilder(IServiceCollection services) { services.ThrowIfNull(nameof(services)); this.services = services; } public ClientWebSocketBuilder WithInnerWebSocket(ClientWebSocket innerWebSocket) { this.innerWebSocket = innerWebSocket.ThrowIfNull(nameof(innerWebSocket)); return this; } public ClientWebSocketBuilder WithInnerWebSocketFactory(Func innerWebSocketFactory) { this.innerWebSocketFactory = innerWebSocketFactory.ThrowIfNull(nameof(innerWebSocketFactory)); return this; } public IServiceCollection Build() { this.services.AddScoped>(sp => { var logger = sp.GetService>(); if (logger is null) { return new ClientWebSocket(); } if (this.innerWebSocketFactory is not null) { return new ClientWebSocket(this.innerWebSocketFactory(sp), logger); } if (this.innerWebSocket is not null) { return new ClientWebSocket(this.innerWebSocket, logger); } return new ClientWebSocket(logger); }); return this.services; } }