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