-
-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathDataPackageAdapter.cs
More file actions
73 lines (67 loc) · 2.95 KB
/
DataPackageAdapter.cs
File metadata and controls
73 lines (67 loc) · 2.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// Copyright (c) BootstrapBlazor & Argo Zhang (argo@live.ca). All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
// Website: https://www.blazor.zone or https://argozhang.github.io/
namespace BootstrapBlazor.Socket.DataAdapters;
/// <summary>
/// Provides a base implementation for adapting data packages between different systems or formats.
/// </summary>
/// <param name="DataPackageHandler"><see cref="IDataPackageHandler"/> 实例</param>
/// <remarks>This abstract class serves as a foundation for implementing custom data package adapters. It defines
/// common methods for sending, receiving, and handling data packages, as well as a property for accessing the
/// associated data package handler. Derived classes should override the virtual methods to provide specific behavior
/// for handling data packages.</remarks>
public class DataPackageAdapter(IDataPackageHandler? DataPackageHandler = null) : IDataPackageAdapter
{
/// <summary>
/// <inheritdoc/>
/// </summary>
public Func<ReadOnlyMemory<byte>, ValueTask>? ReceivedCallBack { get; set; }
/// <summary>
/// <inheritdoc/>
/// </summary>
/// <param name="data"></param>
/// <param name="token"></param>
/// <returns></returns>
public virtual async ValueTask HandlerAsync(ReadOnlyMemory<byte> data, CancellationToken token = default)
{
if (DataPackageHandler != null)
{
DataPackageHandler.ReceivedCallBack ??= OnHandlerReceivedCallBack;
// 如果存在数据处理器则调用其处理方法
await DataPackageHandler.HandlerAsync(data, token);
}
}
/// <summary>
/// <inheritdoc/>
/// </summary>
/// <param name="data"></param>
/// <param name="socketDataConverter"></param>
/// <param name="entity"></param>
/// <returns></returns>
public virtual bool TryConvertTo<TEntity>(ReadOnlyMemory<byte> data, IDataConverter<TEntity> socketDataConverter, out TEntity? entity)
{
entity = default;
var ret = socketDataConverter.TryConvertTo(data, out var v);
if (ret)
{
entity = v;
}
return ret;
}
/// <summary>
/// Handles incoming data by invoking a callback method, if one is defined.
/// </summary>
/// <remarks>This method is designed to be overridden in derived classes to provide custom handling of
/// incoming data. If a callback method is assigned, it will be invoked asynchronously with the provided
/// data.</remarks>
/// <param name="data">The incoming data to be processed, represented as a read-only memory block of bytes.</param>
/// <returns></returns>
protected virtual async ValueTask OnHandlerReceivedCallBack(ReadOnlyMemory<byte> data)
{
if (ReceivedCallBack != null)
{
// 调用接收回调方法处理数据
await ReceivedCallBack(data);
}
}
}