Skip to content

Commit 05875a0

Browse files
committed
refactor: fix DI lifetime
1 parent f32a7d9 commit 05875a0

23 files changed

+133
-146
lines changed

src/SocketIOClient.Serializer/BaseJsonSerializer.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,15 @@ protected BaseJsonSerializer(IDecapsulable decapsulator)
1616
}
1717

1818
protected IDecapsulable Decapsulator { get; }
19+
protected IEngineIOMessageAdapter EngineIOMessageAdapter { get; private set; }
1920
public string Namespace { get; set; }
2021
protected abstract SerializationResult SerializeCore(object[] data);
2122

23+
public void SetEngineIOMessageAdapter(IEngineIOMessageAdapter adapter)
24+
{
25+
EngineIOMessageAdapter = adapter;
26+
}
27+
2228
private static void ThrowIfDataIsInvalid(object[] data)
2329
{
2430
if (data is null)

src/SocketIOClient.Serializer/ISerializer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ public interface ISerializer
1010
List<ProtocolMessage> Serialize(object[] data, int packetId);
1111
List<ProtocolMessage> SerializeAckData(object[] data, int packetId);
1212
IMessage Deserialize(string text);
13+
void SetEngineIOMessageAdapter(IEngineIOMessageAdapter adapter);
1314
}
1415
}

src/SocketIOClient/SocketIOClient.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<RepositoryType>github</RepositoryType>
1515
<Version>3.1.2</Version>
1616
<PackageLicenseExpression>MIT</PackageLicenseExpression>
17-
<LangVersion>default</LangVersion>
17+
<LangVersion>latest</LangVersion>
1818
</PropertyGroup>
1919

2020
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">

src/SocketIOClient/V2/Protocol/Http/IHttpAdapter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace SocketIOClient.V2.Protocol.Http;
66

7-
public interface IHttpAdapter : IProtocolAdapter
7+
public interface IHttpAdapter : IProtocolAdapter // TODO: seems no need IProtocolAdapter.SendAsync(pm)
88
{
99
Task SendAsync(IHttpRequest req, CancellationToken cancellationToken);
1010
Uri Uri { get; set; }

src/SocketIOClient/V2/Serializer/SystemTextJson/SystemJsonSerializer.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,12 @@ namespace SocketIOClient.V2.Serializer.SystemTextJson;
1111

1212
public class SystemJsonSerializer : BaseJsonSerializer
1313
{
14-
public SystemJsonSerializer(IDecapsulable decapsulator, IEngineIOMessageAdapter engineIOMessageAdapter) : base(decapsulator)
14+
public SystemJsonSerializer(IDecapsulable decapsulator) : base(decapsulator)
1515
{
16-
_engineIOMessageAdapter = engineIOMessageAdapter;
1716
JsonSerializerOptions = new JsonSerializerOptions();
1817
}
1918

2019
public JsonSerializerOptions JsonSerializerOptions { get; set; }
21-
private readonly IEngineIOMessageAdapter _engineIOMessageAdapter;
2220

2321
private JsonSerializerOptions NewOptions(JsonConverter converter)
2422
{
@@ -46,11 +44,11 @@ protected override IMessage NewMessage(MessageType type, string text)
4644
MessageType.Opened => NewOpenedMessage(text),
4745
MessageType.Ping => new PingMessage(),
4846
MessageType.Pong => new PongMessage(),
49-
MessageType.Connected => _engineIOMessageAdapter.DeserializeConnectedMessage(text),
47+
MessageType.Connected => EngineIOMessageAdapter.DeserializeConnectedMessage(text),
5048
MessageType.Disconnected => NewDisconnectedMessage(text),
5149
MessageType.Event => NewEventMessage(text),
5250
MessageType.Ack => NewAckMessage(text),
53-
MessageType.Error => _engineIOMessageAdapter.DeserializeErrorMessage(text),
51+
MessageType.Error => EngineIOMessageAdapter.DeserializeErrorMessage(text),
5452
MessageType.Binary => NewBinaryEventMessage(text),
5553
MessageType.BinaryAck => NewBinaryAckMessage(text),
5654
_ => throw new ArgumentOutOfRangeException(nameof(type), type, null),

src/SocketIOClient/V2/Serializer/SystemTextJson/SystemJsonSerializerFactory.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ public class SystemJsonSerializerFactory(IServiceProvider serviceProvider) : ISe
99
{
1010
public ISerializer Create(EngineIO engineIO)
1111
{
12-
var factory = serviceProvider.GetRequiredService<IEngineIOMessageAdapterFactory>();
13-
var adapter = factory.Create(engineIO);
12+
var adapter = serviceProvider.GetRequiredKeyedService<IEngineIOMessageAdapter>(engineIO);
1413
return ActivatorUtilities.CreateInstance<SystemJsonSerializer>(serviceProvider, adapter);
1514
}
1615
}

src/SocketIOClient/V2/ServicesInitializer.cs

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,22 @@ public static IServiceProvider BuildServiceProvider(IServiceCollection services,
2424
services.AddSingleton<IDecapsulable, Decapsulator>();
2525
services.AddSingleton<IHttpClient, SystemHttpClient>();
2626
services.AddSingleton<IRetriable, RandomDelayRetryPolicy>();
27-
services.AddTransient<IHttpAdapter, HttpAdapter>();
27+
services.AddScoped<IHttpAdapter, HttpAdapter>();
2828
services.AddSingleton<IUriConverter>(new DefaultUriConverter());
2929

3030
// SystemTextJson or NewtonsoftJson
3131
// v3 or V4
3232
// Polling or WebSocket
3333
AddSystemTextJson(services);
3434

35-
services.AddSingleton<IEngineIOAdapterFactory, EngineIOAdapterFactory>();
35+
services.AddScoped<IEngineIOAdapterFactory, EngineIOAdapterFactory>();
36+
services.AddKeyedScoped<IEngineIOAdapter, EngineIO3Adapter>(EngineIO.V3);
37+
services.AddKeyedScoped<IEngineIOAdapter, EngineIO4Adapter>(EngineIO.V4);
38+
39+
// TODO: Microsoft.Extensions.Http .AddHttpClient()
3640
services.AddSingleton<HttpMessageInvoker, HttpClient>();
37-
services.AddTransient<ISessionFactory, HttpSessionFactory>();
41+
// services.AddScoped<ISessionFactory, HttpSessionFactory>();
42+
services.AddScoped<ISession, HttpSession>();
3843

3944
configure?.Invoke(services);
4045

@@ -46,6 +51,19 @@ private static void AddSystemTextJson(IServiceCollection services)
4651
services.AddKeyedSingleton<IEngineIOMessageAdapter, SystemJsonEngineIO3MessageAdapter>(EngineIO.V3);
4752
services.AddKeyedSingleton<IEngineIOMessageAdapter, SystemJsonEngineIO4MessageAdapter>(EngineIO.V4);
4853
services.AddSingleton<IEngineIOMessageAdapterFactory, EngineIOMessageAdapterFactory>();
49-
services.AddSingleton<ISerializerFactory, SystemJsonSerializerFactory>();
54+
// TODO: Should be Scoped, need to add test cases to cover it
55+
services.AddSingleton<ISerializer, SystemJsonSerializer>();
56+
}
57+
}
58+
59+
public record ProtocolOptions
60+
{
61+
public ProtocolOptions(TransportProtocol protocol, EngineIO engineIO)
62+
{
63+
Protocol = protocol;
64+
EngineIO = engineIO;
5065
}
66+
67+
public TransportProtocol Protocol { get; }
68+
public EngineIO EngineIO { get; }
5169
}

src/SocketIOClient/V2/Session/EngineIOHttpAdapter/EngineIO3Adapter.cs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Linq;
44
using System.Threading;
55
using System.Threading.Tasks;
6+
using Microsoft.Extensions.Logging;
67
using SocketIOClient.Core;
78
using SocketIOClient.Core.Messages;
89
using SocketIOClient.V2.Infrastructure;
@@ -16,13 +17,13 @@ public sealed class EngineIO3Adapter : IEngineIOAdapter, IDisposable
1617
public EngineIO3Adapter(
1718
IStopwatch stopwatch,
1819
IHttpAdapter httpAdapter,
19-
EngineIOAdapterOptions options,
20-
IRetriable retryPolicy)
20+
IRetriable retryPolicy,
21+
ILogger<EngineIO3Adapter> logger)
2122
{
2223
_stopwatch = stopwatch;
2324
_httpAdapter = httpAdapter;
24-
_options = options;
2525
_retryPolicy = retryPolicy;
26+
_logger = logger;
2627
}
2728

2829
private readonly IStopwatch _stopwatch;
@@ -33,8 +34,10 @@ public EngineIO3Adapter(
3334
private OpenedMessage _openedMessage;
3435

3536
private readonly List<IMyObserver<IMessage>> _observers = [];
36-
private readonly EngineIOAdapterOptions _options;
3737
private readonly IRetriable _retryPolicy;
38+
private readonly ILogger<EngineIO3Adapter> _logger;
39+
40+
public TimeSpan Timeout { get; set; }
3841

3942
public IHttpRequest ToHttpRequest(ICollection<byte[]> bytes)
4043
{
@@ -201,7 +204,7 @@ private async Task StartPingAsync()
201204
var request = ToHttpRequest("2");
202205
await _retryPolicy.RetryAsync(3, async () =>
203206
{
204-
using var cts = new CancellationTokenSource(_options.Timeout);
207+
using var cts = new CancellationTokenSource(Timeout);
205208
await _httpAdapter.SendAsync(request, cts.Token);
206209
});
207210
_stopwatch.Restart();
@@ -236,7 +239,9 @@ private async Task WaitHttpAdapterReady()
236239
await Task.Delay(delay).ConfigureAwait(false);
237240
ms += delay;
238241
}
239-
throw new TimeoutException();
242+
var ex = new TimeoutException();
243+
_logger.LogError(ex, "Wait HttpAdapter ready timeout");
244+
throw ex;
240245
}
241246

242247
private async Task NotifyObserversAsync(IMessage message)

src/SocketIOClient/V2/Session/EngineIOHttpAdapter/EngineIO4Adapter.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,21 @@ public class EngineIO4Adapter : IEngineIOAdapter
1818
public EngineIO4Adapter(
1919
IStopwatch stopwatch,
2020
IHttpAdapter httpAdapter,
21-
EngineIOAdapterOptions options,
2221
IRetriable retryPolicy)
2322
{
2423
_stopwatch = stopwatch;
2524
_httpAdapter = httpAdapter;
26-
_options = options;
2725
_retryPolicy = retryPolicy;
2826
}
2927

3028
private const string Delimiter = "\u001E";
3129
private readonly IStopwatch _stopwatch;
3230
private readonly IHttpAdapter _httpAdapter;
3331
private readonly List<IMyObserver<IMessage>> _observers = [];
34-
private readonly EngineIOAdapterOptions _options;
3532
private readonly IRetriable _retryPolicy;
3633

34+
public TimeSpan Timeout { get; set; }
35+
3736
public IHttpRequest ToHttpRequest(ICollection<byte[]> bytes)
3837
{
3938
if (!bytes.Any())
@@ -108,7 +107,7 @@ private async Task HandlePingMessageAsync()
108107
_stopwatch.Restart();
109108
await _retryPolicy.RetryAsync(3, async () =>
110109
{
111-
using var cts = new CancellationTokenSource(_options.Timeout);
110+
using var cts = new CancellationTokenSource(Timeout);
112111
var pong = ToHttpRequest("3");
113112
await _httpAdapter.SendAsync(pong, cts.Token);
114113
});

src/SocketIOClient/V2/Session/EngineIOHttpAdapter/EngineIOAdapterFactory.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,8 @@ namespace SocketIOClient.V2.Session.EngineIOHttpAdapter;
66

77
public class EngineIOAdapterFactory(IServiceProvider serviceProvider) : IEngineIOAdapterFactory
88
{
9-
public IEngineIOAdapter Create(EngineIO engineIO, EngineIOAdapterOptions options)
9+
public IEngineIOAdapter Create(EngineIO engineIO)
1010
{
11-
if (engineIO == EngineIO.V3)
12-
{
13-
return ActivatorUtilities.CreateInstance<EngineIO3Adapter>(serviceProvider, options);
14-
}
15-
return ActivatorUtilities.CreateInstance<EngineIO4Adapter>(serviceProvider, options);
11+
return serviceProvider.GetRequiredKeyedService<IEngineIOAdapter>(engineIO);
1612
}
1713
}

0 commit comments

Comments
 (0)