diff --git a/src/BootstrapBlazor.Server/Components/Samples/SocketFactories.razor b/src/BootstrapBlazor.Server/Components/Samples/SocketFactories.razor index 58b8bfd2760..396614dac02 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/SocketFactories.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/SocketFactories.razor @@ -110,3 +110,22 @@ class MockEntity return new Foo() { Id = data.Span[0], Name = name }; } } + +

针对第三方程序集的数据类型解决方案如下:

+

使用

+ +
builder.Services.ConfigureSocketDataConverters(options =>
+{
+    options.AddTypeConverter<MockEntity>();
+    options.AddPropertyConverter<MockEntity>(entity => entity.Header, new SocketDataPropertyConverterAttribute()
+    {
+        Offset = 0,
+        Length = 5
+    });
+    options.AddPropertyConverter<MockEntity>(entity => entity.Body, new SocketDataPropertyConverterAttribute()
+    {
+        Offset = 5,
+        Length = 2
+    });
+});
+
diff --git a/src/BootstrapBlazor/Services/TcpSocket/DataConverter/SocketDataConverterCollections.cs b/src/BootstrapBlazor/Services/TcpSocket/DataConverter/SocketDataConverterCollections.cs index 71891e2a0ab..1651988e988 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/DataConverter/SocketDataConverterCollections.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/DataConverter/SocketDataConverterCollections.cs @@ -10,35 +10,41 @@ namespace BootstrapBlazor.Components; /// -/// +/// 数据转换器集合类 /// -public class SocketDataConverterCollections +public sealed class SocketDataConverterCollections { readonly ConcurrentDictionary _converters = new(); readonly ConcurrentDictionary _propertyConverters = new(); /// - /// 增加数据类型转换器方法 + /// 增加指定 数据类型转换器方法 /// /// /// - public void AddOrUpdateTypeConverter(ISocketDataConverter converter) + public void AddTypeConverter(ISocketDataConverter converter) { var type = typeof(TEntity); _converters.AddOrUpdate(type, t => converter, (t, v) => converter); } + /// + /// 增加默认数据类型转换器方法 转换器使用 + /// + /// + public void AddTypeConverter() => AddTypeConverter(new SocketDataConverter(this)); + /// /// 添加属性类型转化器方法 /// /// /// /// - public void AddOrUpdatePropertyConverter(Expression> propertyExpression, SocketDataPropertyConverterAttribute attribute) + public void AddPropertyConverter(Expression> propertyExpression, SocketDataPropertyConverterAttribute attribute) { if (propertyExpression.Body is MemberExpression memberExpression) { - if(attribute.Type == null) + if (attribute.Type == null) { attribute.Type = memberExpression.Type; } diff --git a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataPropertyConverterAttribute.cs b/src/BootstrapBlazor/Services/TcpSocket/DataConverter/SocketDataPropertyConverterAttribute.cs similarity index 100% rename from src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataPropertyConverterAttribute.cs rename to src/BootstrapBlazor/Services/TcpSocket/DataConverter/SocketDataPropertyConverterAttribute.cs diff --git a/test/UnitTest/Services/SocketDataConverterCollectionsTest.cs b/test/UnitTest/Services/SocketDataConverterCollectionsTest.cs index 5f923af1014..db2fe233a09 100644 --- a/test/UnitTest/Services/SocketDataConverterCollectionsTest.cs +++ b/test/UnitTest/Services/SocketDataConverterCollectionsTest.cs @@ -16,21 +16,21 @@ protected override void ConfigureConfiguration(IServiceCollection services) services.ConfigureSocketDataConverters(options => { - options.AddOrUpdateTypeConverter(new SocketDataConverter()); - options.AddOrUpdatePropertyConverter(entity => entity.Header, new SocketDataPropertyConverterAttribute() + options.AddTypeConverter(); + options.AddPropertyConverter(entity => entity.Header, new SocketDataPropertyConverterAttribute() { Offset = 0, Length = 5 }); - options.AddOrUpdatePropertyConverter(entity => entity.Body, new SocketDataPropertyConverterAttribute() + options.AddPropertyConverter(entity => entity.Body, new SocketDataPropertyConverterAttribute() { Offset = 5, Length = 2 }); // 为提高代码覆盖率 重复添加转换器以后面的为准 - options.AddOrUpdateTypeConverter(new SocketDataConverter()); - options.AddOrUpdatePropertyConverter(entity => entity.Header, new SocketDataPropertyConverterAttribute() + options.AddTypeConverter(); + options.AddPropertyConverter(entity => entity.Header, new SocketDataPropertyConverterAttribute() { Offset = 0, Length = 5 diff --git a/test/UnitTest/Services/TcpSocketFactoryTest.cs b/test/UnitTest/Services/TcpSocketFactoryTest.cs index 93e36e8c55c..443a0820b3c 100644 --- a/test/UnitTest/Services/TcpSocketFactoryTest.cs +++ b/test/UnitTest/Services/TcpSocketFactoryTest.cs @@ -770,13 +770,13 @@ public async Task TryGetTypeConverter_Ok() { builder.ConfigureSocketDataConverters(options => { - options.AddOrUpdateTypeConverter(new SocketDataConverter(options)); - options.AddOrUpdatePropertyConverter(entity => entity.Header, new SocketDataPropertyConverterAttribute() + options.AddTypeConverter(); + options.AddPropertyConverter(entity => entity.Header, new SocketDataPropertyConverterAttribute() { Offset = 0, Length = 5 }); - options.AddOrUpdatePropertyConverter(entity => entity.Body, new SocketDataPropertyConverterAttribute() + options.AddPropertyConverter(entity => entity.Body, new SocketDataPropertyConverterAttribute() { Offset = 5, Length = 2