@@ -51,6 +51,56 @@ public static ValueTask<bool> ConnectAsync(this ITcpSocketClient client, string
5151 return client . ConnectAsync ( endPoint , token ) ;
5252 }
5353
54+ private readonly static Dictionary < ( ITcpSocketClient Client , IDataPackageAdapter Adapter ) , List < Func < ReadOnlyMemory < byte > , ValueTask > > > _callbackCache = [ ] ;
55+
56+ /// <summary>
57+ /// 增加 <see cref="ITcpSocketClient"/> 数据适配器及其对应的回调方法
58+ /// </summary>
59+ /// <param name="client"></param>
60+ /// <param name="adapter"></param>
61+ /// <param name="callback"></param>
62+ public static void AddDataPackageAdapter ( this ITcpSocketClient client , IDataPackageAdapter adapter , Func < ReadOnlyMemory < byte > , ValueTask > callback )
63+ {
64+ if ( _callbackCache . TryGetValue ( ( client , adapter ) , out var list ) )
65+ {
66+ list . Add ( cb ) ;
67+ }
68+ else
69+ {
70+ _callbackCache . Add ( ( client , adapter ) , [ cb ] ) ;
71+ }
72+
73+ client . ReceivedCallBack += cb ;
74+
75+ // 设置 DataPackageAdapter 的回调函数
76+ adapter . ReceivedCallBack = buffer => callback ( buffer ) ;
77+
78+ async ValueTask cb ( ReadOnlyMemory < byte > buffer )
79+ {
80+ // 将接收到的数据传递给 DataPackageAdapter 进行数据处理合规数据触发 ReceivedCallBack 回调
81+ await adapter . HandlerAsync ( buffer ) ;
82+ }
83+ }
84+
85+ /// <summary>
86+ /// 移除 <see cref="ITcpSocketClient"/> 数据适配器及其对应的回调方法
87+ /// </summary>
88+ /// <param name="client"></param>
89+ /// <param name="adapter"></param>
90+ /// <param name="callback"></param>
91+ public static void RemoveDataPackageAdapter ( this ITcpSocketClient client , IDataPackageAdapter adapter , Func < ReadOnlyMemory < byte > , ValueTask > callback )
92+ {
93+ if ( _callbackCache . TryGetValue ( ( client , adapter ) , out var list ) )
94+ {
95+ var cbs = list . Where ( i => i == callback ) . ToList ( ) ;
96+ foreach ( var cb in cbs )
97+ {
98+ client . ReceivedCallBack -= cb ;
99+ list . Remove ( cb ) ;
100+ }
101+ }
102+ }
103+
54104 /// <summary>
55105 /// Configures the specified <see cref="ITcpSocketClient"/> to use the provided <see cref="IDataPackageAdapter"/>
56106 /// for processing received data and sets a callback to handle processed data.
0 commit comments