IClientWebSocket builder

This commit is contained in:
2026-01-09 14:26:36 +01:00
parent 3b47d0bd0c
commit a4d0d5cab7
8 changed files with 157 additions and 13 deletions
@@ -2,6 +2,7 @@
using Microsoft.Extensions.Logging;
using Slim;
using System.Net.Http;
using System.Net.WebSockets;
namespace System.Extensions;
@@ -34,6 +35,19 @@ public static class ServiceManagerExtensions
return new HttpClientBuilder<T>(services);
}
/// <summary>
/// Register a scoped <see cref="IClientWebSocket{TScope}"/> to be used by the DI engine.
/// </summary>
/// <typeparam name="T">Type of the scoped <see cref="IClientWebSocket{TScope}"/>.</typeparam>
/// <param name="services"><see cref="IServiceCollection"/>.</param>
/// <returns><see cref="ClientWebSocketBuilder{T}"/> to build the websocket client.</returns>
public static ClientWebSocketBuilder<T> RegisterClientWebSocket<T>(this IServiceCollection services)
{
services.ThrowIfNull(nameof(services));
return new ClientWebSocketBuilder<T>(services);
}
[Obsolete($"{nameof(RegisterHttpFactory)} is obsolete. Please use {nameof(RegisterHttpClient)} for each service that requires an instance of {nameof(IHttpClient<object>)}.")]
public static IServiceProducer RegisterHttpFactory(this IServiceProducer serviceProducer)
{
@@ -6,10 +6,11 @@
<PackageLicenseFile>LICENSE</PackageLicenseFile>
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
<LangVersion>latest</LangVersion>
<Version>1.7</Version>
<Version>1.7.1</Version>
<Authors>Alexandru Macocian</Authors>
<RepositoryUrl>https://github.com/AlexMacocian/SystemExtensions</RepositoryUrl>
<Description>Extensions for the Slim Dependency Injection engine</Description>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
@@ -0,0 +1,58 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System.Extensions;
using System.Net.WebSockets;
namespace System.Net.Http;
public sealed class ClientWebSocketBuilder<T>
{
private readonly IServiceCollection services;
private ClientWebSocket? innerWebSocket;
private Func<IServiceProvider, ClientWebSocket>? innerWebSocketFactory;
internal ClientWebSocketBuilder(IServiceCollection services)
{
services.ThrowIfNull(nameof(services));
this.services = services;
}
public ClientWebSocketBuilder<T> WithInnerWebSocket(ClientWebSocket innerWebSocket)
{
this.innerWebSocket = innerWebSocket.ThrowIfNull(nameof(innerWebSocket));
return this;
}
public ClientWebSocketBuilder<T> WithInnerWebSocketFactory(Func<IServiceProvider, ClientWebSocket> innerWebSocketFactory)
{
this.innerWebSocketFactory = innerWebSocketFactory.ThrowIfNull(nameof(innerWebSocketFactory));
return this;
}
public IServiceCollection Build()
{
this.services.AddScoped<IClientWebSocket<T>>(sp =>
{
var logger = sp.GetService<ILogger<T>>();
if (logger is null)
{
return new ClientWebSocket<T>();
}
if (this.innerWebSocketFactory is not null)
{
return new ClientWebSocket<T>(this.innerWebSocketFactory(sp), logger);
}
if (this.innerWebSocket is not null)
{
return new ClientWebSocket<T>(this.innerWebSocket, logger);
}
return new ClientWebSocket<T>(logger);
});
return this.services;
}
}
@@ -2,6 +2,8 @@
using Slim.Resolvers;
namespace System.Net.WebSockets;
[Obsolete($"Please use {nameof(Extensions.ServiceManagerExtensions.RegisterClientWebSocket)} for each use case of {nameof(IClientWebSocket<object>)}")]
public sealed class ClientWebSocketResolver : IDependencyResolver
{
private static readonly Type ClientType = typeof(ClientWebSocket<>);