diff --git a/src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj b/src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj index ef49367be52..8734c47a161 100644 --- a/src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj +++ b/src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj @@ -68,13 +68,14 @@ + - + diff --git a/src/BootstrapBlazor.Server/Components/Samples/SocketFactories.razor b/src/BootstrapBlazor.Server/Components/Samples/SocketFactories.razor index 250d040910f..823d74aaf76 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/SocketFactories.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/SocketFactories.razor @@ -61,7 +61,9 @@ private async Task CreateClient() { DataPackageHandler = new FixLengthDataPackageHandler(4) }; - client.SetDataPackageAdapter(adapter, buffer => + + // 如果 client 不销毁切记使用 RemoveDataPackageAdapter 移除回调委托防止内存泄露 + client.AddDataPackageAdapter(adapter, buffer => { // buffer 即是接收到的数据 return ValueTask.CompletedTask; diff --git a/src/BootstrapBlazor.Server/Components/Samples/Sockets/Adapters.razor b/src/BootstrapBlazor.Server/Components/Samples/Sockets/Adapters.razor index 7e980048213..2831e0fa2e8 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/Sockets/Adapters.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/Sockets/Adapters.razor @@ -51,8 +51,9 @@ _dataAdapter.ReceivedCallBack = async Data => { // 此处接收到的数据 Data 为完整响应数据 }; -
// 实战中可以使用 ITcpSocketClient 扩展方法 SetDataPackageAdapter 简化代码
-_client.SetDataPackageAdapter(_dataAdapter, UpdateReceiveLog);
+
// 实战中可以使用 ITcpSocketClient 扩展方法 AddDataPackageAdapter 简化代码
+// 如果 _client 实例在当前页面不销毁时,切记使用 AddDataPackageAdapter 移除当前页面加载的 UpdateReceiveLog 回调方法避免内存泄露
+_client.AddDataPackageAdapter(_dataAdapter, UpdateReceiveLog);

本例中使用的模拟服务端代码如下:

diff --git a/src/BootstrapBlazor.Server/Components/Samples/Sockets/Adapters.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/Sockets/Adapters.razor.cs index d7e60e20a07..b421951b9ed 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/Sockets/Adapters.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Samples/Sockets/Adapters.razor.cs @@ -49,7 +49,7 @@ protected override void OnInitialized() _dataAdapter.ReceivedCallBack = UpdateReceiveLog; // 实战中可以通过下面一句话设置数据适配器与回调方法 - // _client.SetDataPackageAdapter(_dataAdapter, UpdateReceiveLog); + // _client.AddDataPackageAdapter(_dataAdapter, UpdateReceiveLog); } diff --git a/src/BootstrapBlazor.Server/Components/Samples/Sockets/DataEntities.razor b/src/BootstrapBlazor.Server/Components/Samples/Sockets/DataEntities.razor index f1498c51879..517b2629302 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/Sockets/DataEntities.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/Sockets/DataEntities.razor @@ -63,7 +63,7 @@ class MockEntity
  • DataUInt64LittleEndianConverter 转成 ulong 无符号整形小端读取
  • 自定义数据类型转化器示例

    -
    [SocketTypeDataConverter(Type = typeof(DataConverter<MockEntity>))]
    +    
    [DataTypeConverter(Type = typeof(DataConverter<MockEntity>))]
     class MockEntity
     {
         [DataPropertyConverter(Type = typeof(byte[]), Offset = 0, Length = 5)]
    @@ -84,3 +84,44 @@ class MockEntity
     }

    更多技术细节可以参考以上内置提供的转换器源码

    + + +

    通过 ConfigureDataConverters 可以配置任意类型(第三方程序集中无源码类型)自定数据转换

    +
    class MockEntity
    +{
    +    public byte[]? Header { get; set; }
    +
    +    public byte[]? Body { get; set; }
    +}
    +
    service.ConfigureDataConverters(options =>
    +{
    +    // 配置 MockEntity 转换
    +    options.AddTypeConverter<MockEntity>();
    +
    +    // 配置 MockEntity 属性 Header 转换逻辑 从起始位置 0 开始读取 5 个字节
    +    options.AddPropertyConverter<MockEntity>(entity => entity.Header, new DataPropertyConverterAttribute()
    +    {
    +        Offset = 0,
    +        Length = 5
    +    });
    +
    +    // 配置 MockEntity 属性 Body 转换逻辑 从起始位置 5 开始读取 2 个字节
    +    options.AddPropertyConverter<MockEntity>(entity => entity.Body, new DataPropertyConverterAttribute()
    +    {
    +        Offset = 5,
    +        Length = 2
    +    });
    +});
    +

    通过调用 ITcpSocketClient 实例泛型扩展方法 AddDataPackageAdapter 在回调方法 OnReceiveAsync 中直接拿到数据实体类

    +
    // 创建一个数据适配器
    +var adapter = new DataPackageAdapter(new FixLengthDataPackageHandler(7));
    +
    +// 设置数据适配器与回调方法
    +_client.AddDataPackageAdapter<MockEntity>(adapter, OnReceiveAsync);
    +
    private async Task OnReceiveAsync(MockEntity? entity)
    +{
    +    return Task.CompletedTask;
    +}
    +
    diff --git a/src/BootstrapBlazor.Server/Locales/en-US.json b/src/BootstrapBlazor.Server/Locales/en-US.json index 152909e805e..e9e7490f9bd 100644 --- a/src/BootstrapBlazor.Server/Locales/en-US.json +++ b/src/BootstrapBlazor.Server/Locales/en-US.json @@ -7163,7 +7163,9 @@ "DataEntityTitle": "Socket Auto Entity", "DataEntityDescription": "After receiving the communication data, it is automatically converted into the entity class required by the business", "NormalTitle": "Basic usage", - "NormalIntro": "Enable automatic data conversion through the DataTypeConverterAttribute attribute" + "NormalIntro": "Enable automatic data conversion through the DataTypeConverterAttribute attribute", + "ConfigTitle": "DataType Converter", + "ConfigIntro": "Use the ConfigureDataConverters method to map the entity class and automatically convert the received data" }, "BootstrapBlazor.Server.Components.Samples.NetworkMonitors": { "NetworkMonitorTitle": "NetworkMonitor", diff --git a/src/BootstrapBlazor.Server/Locales/zh-CN.json b/src/BootstrapBlazor.Server/Locales/zh-CN.json index baa9180c2c8..8f0312dbdb7 100644 --- a/src/BootstrapBlazor.Server/Locales/zh-CN.json +++ b/src/BootstrapBlazor.Server/Locales/zh-CN.json @@ -7165,7 +7165,9 @@ "DataEntityTitle": "Socket 数据转化实体类", "DataEntityDescription": "接收到通讯数据后自动转成业务需要的实体类", "NormalTitle": "基本用法", - "NormalIntro": "通过 DataTypeConverterAttribute 标签开启数据自动转换功能" + "NormalIntro": "通过 DataTypeConverterAttribute 标签开启数据自动转换功能", + "ConfigTitle": "数据实体类映射配置", + "ConfigIntro": "使用 ConfigureDataConverters 方法对实体类进行映射配置将接收到的数据自动转化" }, "BootstrapBlazor.Server.Components.Samples.NetworkMonitors": { "NetworkMonitorTitle": "NetworkMonitor 网络状态",