Skip to content

Commit 6698ea1

Browse files
committed
Add extention AddLibStoredProtocolLayers and use in example
1 parent dc9da43 commit 6698ea1

File tree

3 files changed

+74
-7
lines changed

3 files changed

+74
-7
lines changed

examples/LibStored.Net.Example.Console/Program.cs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@
2121
builder.AddServiceDefaults();
2222
builder.Logging.SetMinimumLevel(LogLevel.Debug);
2323

24-
builder.Services.AddTransient<Debugger>();
25-
builder.Services.AddTransient<LoggerLayer>();
26-
builder.Services.AddTransient<BufferLayer>();
24+
builder.Services.AddLibStoredProtocolLayers();
2725

26+
builder.Services.AddOpenTelemetry()
27+
.WithTracing(x => x.AddSource(OpenTelemetryLayer.ActivitySourceName))
28+
.WithMetrics(x => x.AddMeter(OpenTelemetryLayer.MeterName))
29+
;
2830

2931
builder.Services.AddHostedService<App>();
3032

@@ -209,6 +211,7 @@ private ProtocolBuilder.ProtocolStack CreateDebugStack(ResponseSocket debugSocke
209211
})
210212
.Add<BufferLayer>()
211213
.Add<LoggerLayer>()
214+
.Add<OpenTelemetryLayer>()
212215
.Add<DebugZeroMQLayer>(new DebugZeroMQLayer(debugSocket))
213216
.Build();
214217
}
@@ -223,8 +226,11 @@ private ProtocolBuilder.ProtocolStack CreateDebugStack(ResponseSocket debugSocke
223226
LoggerLayer debugLogging = new(_loggerFactory.CreateLogger<LoggerLayer>());
224227
debugLogging.Wrap(buffer);
225228

229+
OpenTelemetryLayer telemetry = new();
230+
telemetry.Wrap(debugLogging);
231+
226232
DebugZeroMQLayer debugLayer = new DebugZeroMQLayer(debugSocket);
227-
debugLayer.Wrap(debugLogging);
233+
debugLayer.Wrap(telemetry);
228234

229235
stack = ProtocolBuilder.ProtocolStack.Traverse(debugger);
230236
}
@@ -237,9 +243,10 @@ private ProtocolBuilder.ProtocolStack CreateSyncStack(DealerSocket socket, Synch
237243
if (useBuilder)
238244
{
239245
syncStack = ProtocolBuilder.Create(_services)
240-
.Add<SyncConnection>(synchronizer.CreateConnectionLayer())
246+
.Add(synchronizer)
241247
.Add<BufferLayer>()
242248
.Add<LoggerLayer>()
249+
.Add<OpenTelemetryLayer>()
243250
.Add<SyncZeroMQLayer>(new SyncZeroMQLayer(socket))
244251
.Build();
245252
}
@@ -250,8 +257,11 @@ private ProtocolBuilder.ProtocolStack CreateSyncStack(DealerSocket socket, Synch
250257
LoggerLayer logging = new(_loggerFactory.CreateLogger<LoggerLayer>());
251258
logging.Wrap(buffer);
252259

260+
OpenTelemetryLayer telemetry = new();
261+
telemetry.Wrap(logging);
262+
253263
SyncZeroMQLayer sync = new(socket);
254-
sync.Wrap(logging);
264+
sync.Wrap(telemetry);
255265

256266
synchronizer.Connect(buffer);
257267

@@ -261,4 +271,4 @@ private ProtocolBuilder.ProtocolStack CreateSyncStack(DealerSocket socket, Synch
261271
return syncStack;
262272
}
263273
}
264-
}
274+
}

src/LibStored.Net/ProtocolBuilder.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// SPDX-License-Identifier: MIT
44

55
using System.Text;
6+
using LibStored.Net.Synchronization;
67
using Microsoft.Extensions.DependencyInjection;
78

89
namespace LibStored.Net;
@@ -114,6 +115,17 @@ public ProtocolBuilder Add<T>(T layer) where T : Protocol.ProtocolLayer
114115
return this;
115116
}
116117

118+
/// <summary>
119+
/// Creates and adds a <see cref="SyncConnection"/> from a <see cref="Synchronizer"/>.
120+
/// </summary>
121+
/// <param name="synchronizer">The synchronizer used to create the connection layer.</param>
122+
/// <returns>The current <see cref="ProtocolBuilder"/> instance.</returns>
123+
public ProtocolBuilder Add(Synchronizer synchronizer)
124+
{
125+
_layers.Add(synchronizer.CreateConnectionLayer());
126+
return this;
127+
}
128+
117129
/// <summary>
118130
/// Adds a protocol layer of type <typeparamref name="T"/> resolved from the service provider.
119131
/// </summary>
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// SPDX-FileCopyrightText: 2025 Guus Kuiper
2+
//
3+
// SPDX-License-Identifier: MIT
4+
5+
using Microsoft.Extensions.DependencyInjection;
6+
using LibStored.Net.Protocol;
7+
8+
namespace LibStored.Net;
9+
10+
/// <summary>
11+
/// Registers all built‑in protocol layers as transient services.
12+
/// No reflection; each layer is explicitly added.
13+
/// </summary>
14+
public static class ServiceCollectionExtensions
15+
{
16+
/// <summary>
17+
/// Registers all protocol layers with a simple transient lifetime so multiple stacks
18+
/// can be composed independently. Layers that need constructor params have defaults.
19+
/// </summary>
20+
public static IServiceCollection AddLibStoredProtocolLayers(this IServiceCollection services)
21+
{
22+
// Application layers
23+
services.AddTransient<Debugger>();
24+
// The SynchronizationConnection needs to be created from a Synchronizer; not auto-registered.
25+
26+
// Stateless / simple
27+
services.AddTransient<AsciiEscapeLayer>();
28+
services.AddTransient<BufferLayer>();
29+
services.AddTransient<LoggingLayer>();
30+
services.AddTransient<OpenTelemetryLayer>();
31+
services.AddTransient<TerminalLayer>();
32+
33+
services.AddTransient<LoggerLayer>();
34+
services.AddTransient<Crc8Layer>();
35+
services.AddTransient<Crc16Layer>();
36+
37+
// Parameterized layers (use default ctor values)
38+
services.AddTransient<SegmentationLayer>(); // default mtu
39+
services.AddTransient<ArqLayer>(); // default maxEncodeBufferSize
40+
41+
// LoopbackLayer requires two peer layers; not auto-registered (needs runtime pair wiring).
42+
43+
return services;
44+
}
45+
}

0 commit comments

Comments
 (0)