Skip to content

Commit f842f1a

Browse files
committed
refactor: 更新逻辑
1 parent 9855ffb commit f842f1a

2 files changed

Lines changed: 54 additions & 44 deletions

File tree

src/extensions/BootstrapBlazor.Socket/DataConverter/DataConverter.cs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ public class DataConverter<TEntity>(DataConverterCollections converters) : IData
1717
/// </summary>
1818
public DataConverter() : this(new())
1919
{
20-
2120
}
2221

2322
/// <summary>
@@ -28,9 +27,21 @@ public DataConverter() : this(new())
2827
/// <returns></returns>
2928
public virtual bool TryConvertTo(ReadOnlyMemory<byte> data, [NotNullWhen(true)] out TEntity? entity)
3029
{
31-
var v = CreateEntity();
32-
var ret = Parse(data, v);
33-
entity = ret ? v : default;
30+
var ret = false;
31+
entity = default;
32+
try
33+
{
34+
var v = CreateEntity();
35+
if (Parse(data, v))
36+
{
37+
entity = v;
38+
ret = true;
39+
}
40+
}
41+
catch (Exception e)
42+
{
43+
}
44+
3445
return ret;
3546
}
3647

@@ -57,8 +68,7 @@ protected virtual bool Parse(ReadOnlyMemory<byte> data, TEntity entity)
5768
var properties = entity.GetType().GetProperties().Where(p => p.CanWrite).ToList();
5869
foreach (var p in properties)
5970
{
60-
var attr = p.GetCustomAttribute<DataPropertyConverterAttribute>(false)
61-
?? GetPropertyConverterAttribute(p);
71+
var attr = p.GetCustomAttribute<DataPropertyConverterAttribute>(false) ?? GetPropertyConverterAttribute(p);
6272
if (attr is { Type: not null })
6373
{
6474
var value = attr.ConvertTo(data);
@@ -69,8 +79,10 @@ protected virtual bool Parse(ReadOnlyMemory<byte> data, TEntity entity)
6979
}
7080
}
7181
}
82+
7283
ret = true;
7384
}
85+
7486
return ret;
7587
}
7688

@@ -81,6 +93,7 @@ protected virtual bool Parse(ReadOnlyMemory<byte> data, TEntity entity)
8193
{
8294
attr = v;
8395
}
96+
8497
return attr;
8598
}
8699
}

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

Lines changed: 35 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ 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 = [];
114+
private static readonly Dictionary<ITcpSocketClient, List<(Func<ReadOnlyMemory<byte>, ValueTask> ReceivedCallback, Delegate EntityCallback)>> EntityCache = [];
115115

116116
/// <summary>
117117
/// Configures the specified <see cref="ITcpSocketClient"/> to use a data package adapter and a callback function
@@ -135,11 +135,11 @@ async ValueTask ReceivedCallback(ReadOnlyMemory<byte> buffer)
135135

136136
if (EntityCache.TryGetValue(client, out var list))
137137
{
138-
list.Add((adapter, ReceivedCallback));
138+
list.Add((ReceivedCallback, callback));
139139
}
140140
else
141141
{
142-
Cache.Add(client, [(adapter, ReceivedCallback)]);
142+
EntityCache.Add(client, [(ReceivedCallback, callback)]);
143143
}
144144

145145
client.ReceivedCallBack += ReceivedCallback;
@@ -156,6 +156,24 @@ async ValueTask ReceivedCallback(ReadOnlyMemory<byte> buffer)
156156
};
157157
}
158158

159+
/// <summary>
160+
/// 移除 <see cref="ITcpSocketClient"/> 数据适配器及其对应的回调方法
161+
/// </summary>
162+
/// <param name="client"></param>
163+
/// <param name="callback"></param>
164+
public static void RemoveDataPackageAdapter<TEntity>(this ITcpSocketClient client, Func<TEntity?, Task> callback)
165+
{
166+
if (EntityCache.TryGetValue(client, out var list))
167+
{
168+
var items = list.Where(i => i.EntityCallback.Equals(callback)).ToList();
169+
foreach (var c in items)
170+
{
171+
client.ReceivedCallBack -= c.ReceivedCallback;
172+
list.Remove(c);
173+
}
174+
}
175+
}
176+
159177
/// <summary>
160178
/// 通过指定 <see cref="IDataPackageHandler"/> 数据处理实例,设置数据适配器并配置回调方法
161179
/// </summary>
@@ -192,13 +210,15 @@ async ValueTask ReceivedCallback(ReadOnlyMemory<byte> buffer)
192210

193211
if (EntityCache.TryGetValue(client, out var list))
194212
{
195-
list.Add((adapter, ReceivedCallback));
213+
list.Add((ReceivedCallback, callback));
196214
}
197215
else
198216
{
199-
EntityCache.Add(client, [(adapter, ReceivedCallback)]);
217+
EntityCache.Add(client, [(ReceivedCallback, callback)]);
200218
}
201219

220+
client.ReceivedCallBack += ReceivedCallback;
221+
202222
IDataConverter<TEntity>? converter = null;
203223

204224
var type = typeof(TEntity);
@@ -212,13 +232,21 @@ async ValueTask ReceivedCallback(ReadOnlyMemory<byte> buffer)
212232

213233
if (converter == null)
214234
{
215-
// 设置正常回调
235+
// 未设置数据转换器返回 default 值
216236
adapter.ReceivedCallBack = async buffer => await callback(default);
217237
}
218238
else
219239
{
220240
// 设置转化器
221-
adapter.SetDataAdapterCallback(converter, callback);
241+
adapter.ReceivedCallBack = async buffer =>
242+
{
243+
TEntity? ret = default;
244+
if (converter.TryConvertTo(buffer, out var t))
245+
{
246+
ret = t;
247+
}
248+
await callback(ret);
249+
};
222250
}
223251
}
224252

@@ -233,19 +261,6 @@ public static void AddDataPackageAdapter<TEntity>(this ITcpSocketClient client,
233261
client.AddDataPackageAdapter(new DataPackageAdapter(handler), callback);
234262
}
235263

236-
private static void SetDataAdapterCallback<TEntity>(this IDataPackageAdapter adapter, IDataConverter<TEntity> converter, Func<TEntity?, Task> callback)
237-
{
238-
adapter.ReceivedCallBack = async buffer =>
239-
{
240-
TEntity? ret = default;
241-
if (converter.TryConvertTo(buffer, out var t))
242-
{
243-
ret = t;
244-
}
245-
await callback(ret);
246-
};
247-
}
248-
249264
private static IDataConverter<TEntity>? GetSocketDataConverter<TEntity>(this ITcpSocketClient client)
250265
{
251266
IDataConverter<TEntity>? converter = null;
@@ -259,22 +274,4 @@ private static void SetDataAdapterCallback<TEntity>(this IDataPackageAdapter ada
259274
}
260275
return converter;
261276
}
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-
}
280277
}

0 commit comments

Comments
 (0)