@@ -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