Skip to content

Commit 0ffa02e

Browse files
committed
[修改] ProtoBase 模块增加 XML 文档注释,新增 DefaultConstructorPipelineFilterFactory,优化扩展方法和管线过滤器工厂
1 parent 2e18525 commit 0ffa02e

9 files changed

Lines changed: 210 additions & 68 deletions
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using System;
2+
using GameFrameX.SuperSocket.ProtoBase;
3+
4+
namespace SuperSocket.ProtoBase
5+
{
6+
/// <summary>
7+
/// A factory for creating instances of a specified pipeline filter type which has default constructor.
8+
/// </summary>
9+
/// <typeparam name="TPackageInfo">The type of the package information.</typeparam>
10+
/// <typeparam name="TPipelineFilter">The type of the pipeline filter to create.</typeparam>
11+
public class DefaultConstructorPipelineFilterFactory<TPackageInfo, TPipelineFilter> : PipelineFilterFactoryBase<TPackageInfo>
12+
where TPipelineFilter : IPipelineFilter<TPackageInfo>, new()
13+
{
14+
/// <summary>
15+
/// Gets the package decoder used by the pipeline filters.
16+
/// </summary>
17+
protected IPackageDecoder<TPackageInfo> PackageDecoder { get; private set; }
18+
19+
/// <summary>
20+
/// Initializes a new instance of the <see cref="DefaultConstructorPipelineFilterFactory{TPackageInfo, TPipelineFilter}"/> class.
21+
/// </summary>
22+
/// <param name="serviceProvider">The service provider for dependency injection.</param>
23+
public DefaultConstructorPipelineFilterFactory(IServiceProvider serviceProvider)
24+
{
25+
PackageDecoder = serviceProvider.GetService(typeof(IPackageDecoder<TPackageInfo>)) as IPackageDecoder<TPackageInfo>;
26+
}
27+
28+
/// <summary>
29+
/// Creates a new instance of the specified pipeline filter type.
30+
/// </summary>
31+
/// <returns>The created pipeline filter.</returns>
32+
protected override IPipelineFilter<TPackageInfo> Create()
33+
{
34+
var filter = new TPipelineFilter();
35+
filter.Decoder = PackageDecoder;
36+
return filter;
37+
}
38+
}
39+
}
Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
13
namespace GameFrameX.SuperSocket.ProtoBase
24
{
35
/// <summary>
@@ -6,25 +8,26 @@ namespace GameFrameX.SuperSocket.ProtoBase
68
/// <typeparam name="TPackageInfo">The type of the package information.</typeparam>
79
/// <typeparam name="TPipelineFilter">The type of the pipeline filter to create.</typeparam>
810
public class DefaultPipelineFilterFactory<TPackageInfo, TPipelineFilter> : PipelineFilterFactoryBase<TPackageInfo>
9-
where TPipelineFilter : IPipelineFilter<TPackageInfo>, new()
11+
where TPipelineFilter : IPipelineFilter<TPackageInfo>
1012
{
13+
private readonly IServiceProvider _serviceProvider;
14+
1115
/// <summary>
1216
/// Initializes a new instance of the <see cref="DefaultPipelineFilterFactory{TPackageInfo, TPipelineFilter}"/> class.
1317
/// </summary>
1418
/// <param name="serviceProvider">The service provider for dependency injection.</param>
1519
public DefaultPipelineFilterFactory(IServiceProvider serviceProvider)
16-
: base(serviceProvider)
1720
{
21+
this._serviceProvider = serviceProvider;
1822
}
1923

2024
/// <summary>
2125
/// Creates a new instance of the specified pipeline filter type.
2226
/// </summary>
23-
/// <param name="client">The client for which the pipeline filter is created.</param>
2427
/// <returns>The created pipeline filter.</returns>
25-
protected override IPipelineFilter<TPackageInfo> CreateCore(object client)
28+
protected override IPipelineFilter<TPackageInfo> Create()
2629
{
27-
return new TPipelineFilter();
30+
return _serviceProvider.GetRequiredService<TPipelineFilter>();
2831
}
2932
}
3033
}
Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
namespace GameFrameX.SuperSocket.ProtoBase
23
{
34
/// <summary>
@@ -6,27 +7,25 @@ namespace GameFrameX.SuperSocket.ProtoBase
67
/// <typeparam name="TPackageInfo">The type of the package information.</typeparam>
78
public class DelegatePipelineFilterFactory<TPackageInfo> : PipelineFilterFactoryBase<TPackageInfo>
89
{
9-
private readonly Func<object, IPipelineFilter<TPackageInfo>> _factory;
10+
private readonly Func<IPipelineFilter<TPackageInfo>> _factory;
1011

1112
/// <summary>
1213
/// Initializes a new instance of the <see cref="DelegatePipelineFilterFactory{TPackageInfo}"/> class with the specified service provider and factory delegate.
1314
/// </summary>
1415
/// <param name="serviceProvider">The service provider used to resolve dependencies.</param>
1516
/// <param name="factory">The delegate used to create pipeline filters.</param>
16-
public DelegatePipelineFilterFactory(IServiceProvider serviceProvider, Func<object, IPipelineFilter<TPackageInfo>> factory)
17-
: base(serviceProvider)
17+
public DelegatePipelineFilterFactory(IServiceProvider serviceProvider, Func<IPipelineFilter<TPackageInfo>> factory)
1818
{
1919
_factory = factory;
2020
}
2121

2222
/// <summary>
2323
/// Creates a pipeline filter for the specified client using the factory delegate.
2424
/// </summary>
25-
/// <param name="client">The client for which the pipeline filter is created.</param>
2625
/// <returns>The created pipeline filter.</returns>
27-
protected override IPipelineFilter<TPackageInfo> CreateCore(object client)
26+
protected override IPipelineFilter<TPackageInfo> Create()
2827
{
29-
return _factory(client);
28+
return _factory();
3029
}
3130
}
3231
}

src/GameFrameX.SuperSocket.ProtoBase/Extensions.cs

Lines changed: 141 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ namespace GameFrameX.SuperSocket.ProtoBase
88
/// </summary>
99
public static class Extensions
1010
{
11+
private static readonly ReadOnlyMemory<byte> CRLF = Encoding.ASCII.GetBytes("\r\n").AsMemory();
12+
1113
/// <summary>
1214
/// Reads a string from the sequence reader using UTF-8 encoding.
1315
/// </summary>
@@ -62,7 +64,7 @@ public static bool TryReadBigEndian(ref this SequenceReader<byte> reader, out us
6264
if (!reader.TryRead(out byte l))
6365
return false;
6466

65-
value = (ushort)(h * 256 + l);
67+
value = (ushort)((h << 8) | l);
6668
return true;
6769
}
6870

@@ -79,19 +81,19 @@ public static bool TryReadBigEndian(ref this SequenceReader<byte> reader, out ui
7981
if (reader.Remaining < 4)
8082
return false;
8183

82-
var v = 0;
83-
var unit = (int)Math.Pow(256, 3);
84+
if (!reader.TryRead(out byte b0))
85+
return false;
8486

85-
for (var i = 0; i < 4; i++)
86-
{
87-
if (!reader.TryRead(out byte b))
88-
return false;
87+
if (!reader.TryRead(out byte b1))
88+
return false;
8989

90-
v += unit * b;
91-
unit = unit / 256;
92-
}
90+
if (!reader.TryRead(out byte b2))
91+
return false;
9392

94-
value = (uint)v;
93+
if (!reader.TryRead(out byte b3))
94+
return false;
95+
96+
value = (uint)((b0 << 24) | (b1 << 16) | (b2 << 8) | b3);
9597
return true;
9698
}
9799

@@ -108,19 +110,126 @@ public static bool TryReadBigEndian(ref this SequenceReader<byte> reader, out ul
108110
if (reader.Remaining < 8)
109111
return false;
110112

111-
var v = 0L;
112-
var unit = (long)Math.Pow(256, 7);
113+
if (!reader.TryRead(out byte b0))
114+
return false;
113115

114-
for (var i = 0; i < 8; i++)
115-
{
116-
if (!reader.TryRead(out byte b))
117-
return false;
116+
if (!reader.TryRead(out byte b1))
117+
return false;
118118

119-
v += unit * b;
120-
unit = unit / 256;
121-
}
119+
if (!reader.TryRead(out byte b2))
120+
return false;
121+
122+
if (!reader.TryRead(out byte b3))
123+
return false;
124+
125+
if (!reader.TryRead(out byte b4))
126+
return false;
127+
128+
if (!reader.TryRead(out byte b5))
129+
return false;
130+
131+
if (!reader.TryRead(out byte b6))
132+
return false;
133+
134+
if (!reader.TryRead(out byte b7))
135+
return false;
136+
137+
value = ((ulong)b0 << 56) | ((ulong)b1 << 48) | ((ulong)b2 << 40) | ((ulong)b3 << 32) |
138+
((ulong)b4 << 24) | ((ulong)b5 << 16) | ((ulong)b6 << 8) | b7;
139+
return true;
140+
}
141+
142+
/// <summary>
143+
/// Attempts to read a 16-bit unsigned integer in little-endian format from the sequence reader.
144+
/// </summary>
145+
/// <param name="reader">The sequence reader.</param>
146+
/// <param name="value">The read value.</param>
147+
/// <returns><c>true</c> if the value was successfully read; otherwise, <c>false</c>.</returns>
148+
public static bool TryReadLittleEndian(ref this SequenceReader<byte> reader, out ushort value)
149+
{
150+
value = 0;
151+
152+
if (reader.Remaining < 2)
153+
return false;
154+
155+
if (!reader.TryRead(out byte l))
156+
return false;
157+
158+
if (!reader.TryRead(out byte h))
159+
return false;
160+
161+
value = (ushort)((h << 8) | l);
162+
return true;
163+
}
164+
165+
/// <summary>
166+
/// Attempts to read a 32-bit unsigned integer in little-endian format from the sequence reader.
167+
/// </summary>
168+
/// <param name="reader">The sequence reader.</param>
169+
/// <param name="value">The read value.</param>
170+
/// <returns><c>true</c> if the value was successfully read; otherwise, <c>false</c>.</returns>
171+
public static bool TryReadLittleEndian(ref this SequenceReader<byte> reader, out uint value)
172+
{
173+
value = 0;
174+
175+
if (reader.Remaining < 4)
176+
return false;
177+
178+
if (!reader.TryRead(out byte b0))
179+
return false;
180+
181+
if (!reader.TryRead(out byte b1))
182+
return false;
183+
184+
if (!reader.TryRead(out byte b2))
185+
return false;
186+
187+
if (!reader.TryRead(out byte b3))
188+
return false;
122189

123-
value = (ulong)v;
190+
value = (uint)((b3 << 24) | (b2 << 16) | (b1 << 8) | b0);
191+
return true;
192+
}
193+
194+
/// <summary>
195+
/// Attempts to read a 64-bit unsigned integer in little-endian format from the sequence reader.
196+
/// </summary>
197+
/// <param name="reader">The sequence reader.</param>
198+
/// <param name="value">The read value.</param>
199+
/// <returns><c>true</c> if the value was successfully read; otherwise, <c>false</c>.</returns>
200+
public static bool TryReadLittleEndian(ref this SequenceReader<byte> reader, out ulong value)
201+
{
202+
value = 0;
203+
204+
if (reader.Remaining < 8)
205+
return false;
206+
207+
if (!reader.TryRead(out byte b0))
208+
return false;
209+
210+
if (!reader.TryRead(out byte b1))
211+
return false;
212+
213+
if (!reader.TryRead(out byte b2))
214+
return false;
215+
216+
if (!reader.TryRead(out byte b3))
217+
return false;
218+
219+
if (!reader.TryRead(out byte b4))
220+
return false;
221+
222+
if (!reader.TryRead(out byte b5))
223+
return false;
224+
225+
if (!reader.TryRead(out byte b6))
226+
return false;
227+
228+
if (!reader.TryRead(out byte b7))
229+
return false;
230+
231+
value = ((ulong)b7 << 56) | ((ulong)b6 << 48) | ((ulong)b5 << 40) | ((ulong)b4 << 32) |
232+
((ulong)b3 << 24) | ((ulong)b2 << 16) | ((ulong)b1 << 8) | b0;
124233
return true;
125234
}
126235

@@ -192,5 +301,16 @@ public static int Write(this IBufferWriter<byte> writer, ReadOnlySpan<char> text
192301

193302
return totalBytes;
194303
}
304+
305+
/// <summary>
306+
/// Writes a CRLF (Carriage Return + Line Feed) sequence to the buffer writer.
307+
/// </summary>
308+
/// <param name="writer">The buffer writer.</param>
309+
/// <returns>The total number of bytes written to the buffer writer.</returns>
310+
public static int WriteCrLf(this IBufferWriter<byte> writer)
311+
{
312+
writer.Write(CRLF.Span);
313+
return CRLF.Length;
314+
}
195315
}
196316
}

src/GameFrameX.SuperSocket.ProtoBase/IPipelineFilterFactory.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,8 @@ public interface IPipelineFilterFactory<TPackageInfo>
99
/// <summary>
1010
/// Creates a pipeline filter for the specified client.
1111
/// </summary>
12-
/// <param name="client">The client for which the pipeline filter is created.</param>
1312
/// <returns>The created pipeline filter.</returns>
14-
IPipelineFilter<TPackageInfo> Create(object client);
13+
IPipelineFilter<TPackageInfo> Create();
1514
}
1615

1716
/// <summary>
@@ -22,8 +21,7 @@ public interface IPipelineFilterFactory
2221
/// <summary>
2322
/// Creates a pipeline filter for the specified client.
2423
/// </summary>
25-
/// <param name="client">The client for which the pipeline filter is created.</param>
2624
/// <returns>The created pipeline filter.</returns>
27-
IPipelineFilter Create(object client);
25+
IPipelineFilter Create();
2826
}
2927
}

src/GameFrameX.SuperSocket.ProtoBase/PipelineFilterFactoryBase.cs

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,47 +6,28 @@ namespace GameFrameX.SuperSocket.ProtoBase
66
/// <typeparam name="TPackageInfo">The type of the package information.</typeparam>
77
public abstract class PipelineFilterFactoryBase<TPackageInfo> : IPipelineFilterFactory<TPackageInfo>, IPipelineFilterFactory
88
{
9-
/// <summary>
10-
/// Gets the package decoder used by the pipeline filters.
11-
/// </summary>
12-
protected IPackageDecoder<TPackageInfo> PackageDecoder { get; private set; }
13-
14-
/// <summary>
15-
/// Initializes a new instance of the <see cref="PipelineFilterFactoryBase{TPackageInfo}"/> class with the specified service provider.
16-
/// </summary>
17-
/// <param name="serviceProvider">The service provider used to resolve dependencies.</param>
18-
public PipelineFilterFactoryBase(IServiceProvider serviceProvider)
19-
{
20-
PackageDecoder = serviceProvider.GetService(typeof(IPackageDecoder<TPackageInfo>)) as IPackageDecoder<TPackageInfo>;
21-
}
22-
239
/// <summary>
2410
/// Creates a pipeline filter for the specified client.
2511
/// </summary>
26-
/// <param name="client">The client for which the pipeline filter is created.</param>
2712
/// <returns>The created pipeline filter.</returns>
28-
protected abstract IPipelineFilter<TPackageInfo> CreateCore(object client);
13+
protected abstract IPipelineFilter<TPackageInfo> Create();
2914

3015
/// <summary>
3116
/// Creates a pipeline filter for the specified client and assigns the package decoder.
3217
/// </summary>
33-
/// <param name="client">The client for which the pipeline filter is created.</param>
3418
/// <returns>The created pipeline filter with the package decoder assigned.</returns>
35-
public virtual IPipelineFilter<TPackageInfo> Create(object client)
19+
IPipelineFilter<TPackageInfo> IPipelineFilterFactory<TPackageInfo>.Create()
3620
{
37-
var filter = CreateCore(client);
38-
filter.Decoder = PackageDecoder;
39-
return filter;
21+
return Create();
4022
}
4123

4224
/// <summary>
4325
/// Creates a pipeline filter for the specified client.
4426
/// </summary>
45-
/// <param name="client">The client for which the pipeline filter is created.</param>
4627
/// <returns>The created pipeline filter.</returns>
47-
IPipelineFilter IPipelineFilterFactory.Create(object client)
28+
IPipelineFilter IPipelineFilterFactory.Create()
4829
{
49-
return this.Create(client) as IPipelineFilter;
30+
return Create();
5031
}
5132
}
5233
}

0 commit comments

Comments
 (0)