Skip to content

Commit 9855ffb

Browse files
committed
refactor: 更新缓存逻辑
1 parent 699fd06 commit 9855ffb

1 file changed

Lines changed: 39 additions & 23 deletions

File tree

src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -61,22 +61,22 @@ public static ValueTask<bool> ConnectAsync(this ITcpSocketClient client, string
6161
/// <param name="callback"></param>
6262
public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPackageAdapter adapter, Func<ReadOnlyMemory<byte>, ValueTask> callback)
6363
{
64-
async ValueTask cb(ReadOnlyMemory<byte> buffer)
64+
async ValueTask ReceivedCallback(ReadOnlyMemory<byte> buffer)
6565
{
6666
// 将接收到的数据传递给 DataPackageAdapter 进行数据处理合规数据触发 ReceivedCallBack 回调
6767
await adapter.HandlerAsync(buffer);
6868
}
6969

7070
if (Cache.TryGetValue(client, out var list))
7171
{
72-
list.Add((adapter, cb));
72+
list.Add((adapter, ReceivedCallback));
7373
}
7474
else
7575
{
76-
Cache.Add(client, [(adapter, cb)]);
76+
Cache.Add(client, [(adapter, ReceivedCallback)]);
7777
}
7878

79-
client.ReceivedCallBack += cb;
79+
client.ReceivedCallBack += ReceivedCallback;
8080

8181
// 设置 DataPackageAdapter 的回调函数
8282
adapter.ReceivedCallBack = callback;
@@ -111,6 +111,8 @@ public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPack
111111
client.AddDataPackageAdapter(new DataPackageAdapter(handler), callback);
112112
}
113113

114+
private static readonly Dictionary<ITcpSocketClient, List<(IDataPackageAdapter Adapter, Delegate Callback)>> EntityCache = [];
115+
114116
/// <summary>
115117
/// Configures the specified <see cref="ITcpSocketClient"/> to use a data package adapter and a callback function
116118
/// for processing received data.
@@ -125,22 +127,22 @@ public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPack
125127
/// <param name="callback">The callback function to be invoked with the converted entity.</param>
126128
public static void AddDataPackageAdapter<TEntity>(this ITcpSocketClient client, IDataPackageAdapter adapter, IDataConverter<TEntity> socketDataConverter, Func<TEntity?, Task> callback)
127129
{
128-
async ValueTask cb(ReadOnlyMemory<byte> buffer)
130+
async ValueTask ReceivedCallback(ReadOnlyMemory<byte> buffer)
129131
{
130132
// 将接收到的数据传递给 DataPackageAdapter 进行数据处理合规数据触发 ReceivedCallBack 回调
131133
await adapter.HandlerAsync(buffer);
132134
}
133135

134-
if (Cache.TryGetValue(client, out var list))
136+
if (EntityCache.TryGetValue(client, out var list))
135137
{
136-
list.Add((adapter, cb));
138+
list.Add((adapter, ReceivedCallback));
137139
}
138140
else
139141
{
140-
Cache.Add(client, [(adapter, cb)]);
142+
Cache.Add(client, [(adapter, ReceivedCallback)]);
141143
}
142144

143-
client.ReceivedCallBack += cb;
145+
client.ReceivedCallBack += ReceivedCallback;
144146

145147
// 设置 DataPackageAdapter 的回调函数
146148
adapter.ReceivedCallBack = async buffer =>
@@ -182,35 +184,31 @@ public static void AddDataPackageAdapter<TEntity>(this ITcpSocketClient client,
182184
/// <param name="callback">The callback function to invoke with the processed entity of type <typeparamref name="TEntity"/>.</param>
183185
public static void AddDataPackageAdapter<TEntity>(this ITcpSocketClient client, IDataPackageAdapter adapter, Func<TEntity?, Task> callback)
184186
{
185-
async ValueTask cb(ReadOnlyMemory<byte> buffer)
187+
async ValueTask ReceivedCallback(ReadOnlyMemory<byte> buffer)
186188
{
187189
// 将接收到的数据传递给 DataPackageAdapter 进行数据处理合规数据触发 ReceivedCallBack 回调
188190
await adapter.HandlerAsync(buffer);
189191
}
190192

191-
if (Cache.TryGetValue(client, out var list))
193+
if (EntityCache.TryGetValue(client, out var list))
192194
{
193-
list.Add((adapter, cb));
195+
list.Add((adapter, ReceivedCallback));
194196
}
195197
else
196198
{
197-
Cache.Add(client, [(adapter, cb)]);
199+
EntityCache.Add(client, [(adapter, ReceivedCallback)]);
198200
}
199201

200202
IDataConverter<TEntity>? converter = null;
201203

202204
var type = typeof(TEntity);
203205
var converterType = type.GetCustomAttribute<DataTypeConverterAttribute>();
204-
if (converterType is { Type: not null })
205-
{
206-
// 如果类型上有 SocketDataTypeConverterAttribute 特性则使用特性中指定的转换器
207-
converter = converterType.Type.CreateInstance<IDataConverter<TEntity>>();
208-
}
209-
else
210-
{
211-
// 如果没有特性则从 ITcpSocketClient 中的服务容器获取转换器
212-
converter = client.GetSocketDataConverter<TEntity>();
213-
}
206+
207+
// 如果类型上有 SocketDataTypeConverterAttribute 特性则使用特性中指定的转换器
208+
// 如果没有特性则从 ITcpSocketClient 中的服务容器获取转换器
209+
converter = converterType is { Type: not null }
210+
? converterType.Type.CreateInstance<IDataConverter<TEntity>>()
211+
: client.GetSocketDataConverter<TEntity>();
214212

215213
if (converter == null)
216214
{
@@ -261,4 +259,22 @@ private static void SetDataAdapterCallback<TEntity>(this IDataPackageAdapter ada
261259
}
262260
return converter;
263261
}
262+
263+
/// <summary>
264+
/// 移除 <see cref="ITcpSocketClient"/> 数据适配器及其对应的回调方法
265+
/// </summary>
266+
/// <param name="client"></param>
267+
/// <param name="callback"></param>
268+
public static void RemoveDataPackageAdapter<TEntity>(this ITcpSocketClient client, Func<TEntity?, Task> callback)
269+
{
270+
if (EntityCache.TryGetValue(client, out var list))
271+
{
272+
var items = list.Where(i => i.Adapter.ReceivedCallBack == callback).ToList();
273+
foreach (var c in items)
274+
{
275+
client.ReceivedCallBack -= c.Callback;
276+
list.Remove(c);
277+
}
278+
}
279+
}
264280
}

0 commit comments

Comments
 (0)