Skip to content

Commit 3a70a55

Browse files
committedMar 26, 2025
[DEVEX-222] Reshaped type resolution strategy to take EventRecord instead of just raw string.
That should enable current users to override their strategy if they used something more than just message type name from EventRecord. It needs to be EventRecord and not ResolvedEvent, as resolution happens before creating ResolvedEvent.
1 parent b135a83 commit 3a70a55

File tree

7 files changed

+74
-54
lines changed

7 files changed

+74
-54
lines changed
 

‎src/KurrentDB.Client/Core/Serialization/MessageSerializer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public bool TryDeserialize(EventRecord record, out Message? deserialized) {
6666
#else
6767
public bool TryDeserialize(EventRecord record, [NotNullWhen(true)] out Message? deserialized) {
6868
#endif
69-
if (!schemaRegistry.TryResolveClrType(record.EventType, out var clrType)) {
69+
if (!schemaRegistry.TryResolveClrType(record, out var clrType)) {
7070
deserialized = null;
7171
return false;
7272
}
@@ -81,7 +81,7 @@ public bool TryDeserialize(EventRecord record, [NotNullWhen(true)] out Message?
8181
}
8282

8383
object? metadata = record.Metadata.Length > 0
84-
&& schemaRegistry.TryResolveClrMetadataType(record.EventType, out var clrMetadataType)
84+
&& schemaRegistry.TryResolveClrMetadataType(record, out var clrMetadataType)
8585
? _metadataSerializer.Deserialize(record.Metadata, clrMetadataType!)
8686
: null;
8787

‎src/KurrentDB.Client/Core/Serialization/MessageTypeResolutionStrategy.cs

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ public interface IMessageTypeNamingStrategy {
77
string ResolveTypeName(Type messageType, MessageTypeNamingResolutionContext resolutionContext);
88

99
#if NET48
10-
bool TryResolveClrType(string messageTypeName, out Type? type);
10+
bool TryResolveClrType(EventRecord record, out Type? type);
1111
#else
12-
bool TryResolveClrType(string messageTypeName, [NotNullWhen(true)] out Type? type);
12+
bool TryResolveClrType(EventRecord messageTypeName, [NotNullWhen(true)] out Type? type);
1313
#endif
1414

1515
#if NET48
16-
bool TryResolveClrMetadataType(string messageTypeName, out Type? type);
16+
bool TryResolveClrMetadataType(EventRecord record, out Type? type);
1717
#else
18-
bool TryResolveClrMetadataType(string messageTypeName, [NotNullWhen(true)] out Type? type);
18+
bool TryResolveClrMetadataType(EventRecord messageTypeName, [NotNullWhen(true)] out Type? type);
1919
#endif
2020
}
2121

@@ -36,13 +36,13 @@ public string ResolveTypeName(Type messageType, MessageTypeNamingResolutionConte
3636
}
3737

3838
#if NET48
39-
public bool TryResolveClrType(string messageTypeName, out Type? type) {
39+
public bool TryResolveClrType(EventRecord record, out Type? type) {
4040
#else
41-
public bool TryResolveClrType(string messageTypeName, [NotNullWhen(true)] out Type? type) {
41+
public bool TryResolveClrType(EventRecord record, [NotNullWhen(true)] out Type? type) {
4242
#endif
4343
type = messageTypeRegistry.GetOrAddClrType(
44-
messageTypeName,
45-
_ => messageTypeNamingStrategy.TryResolveClrType(messageTypeName, out var resolvedType)
44+
record.EventType,
45+
_ => messageTypeNamingStrategy.TryResolveClrType(record, out var resolvedType)
4646
? resolvedType
4747
: null
4848
);
@@ -51,13 +51,13 @@ public bool TryResolveClrType(string messageTypeName, [NotNullWhen(true)] out Ty
5151
}
5252

5353
#if NET48
54-
public bool TryResolveClrMetadataType(string messageTypeName, out Type? type) {
54+
public bool TryResolveClrMetadataType(EventRecord record, out Type? type) {
5555
#else
56-
public bool TryResolveClrMetadataType(string messageTypeName, [NotNullWhen(true)] out Type? type) {
56+
public bool TryResolveClrMetadataType(EventRecord record, [NotNullWhen(true)] out Type? type) {
5757
#endif
5858
type = messageTypeRegistry.GetOrAddClrType(
59-
$"{messageTypeName}-metadata",
60-
_ => messageTypeNamingStrategy.TryResolveClrMetadataType(messageTypeName, out var resolvedType)
59+
$"{record}-metadata",
60+
_ => messageTypeNamingStrategy.TryResolveClrMetadataType(record, out var resolvedType)
6161
? resolvedType
6262
: null
6363
);
@@ -73,10 +73,11 @@ public string ResolveTypeName(Type messageType, MessageTypeNamingResolutionConte
7373
$"{resolutionContext.CategoryName}-{messageType.FullName}";
7474

7575
#if NET48
76-
public bool TryResolveClrType(string messageTypeName, out Type? type) {
76+
public bool TryResolveClrType(EventRecord record, out Type? type) {
7777
#else
78-
public bool TryResolveClrType(string messageTypeName, [NotNullWhen(true)] out Type? type) {
78+
public bool TryResolveClrType(EventRecord record, [NotNullWhen(true)] out Type? type) {
7979
#endif
80+
var messageTypeName = record.EventType;
8081
var categorySeparatorIndex = messageTypeName.IndexOf('-');
8182

8283
if (categorySeparatorIndex == -1 || categorySeparatorIndex == messageTypeName.Length - 1) {
@@ -92,9 +93,9 @@ public bool TryResolveClrType(string messageTypeName, [NotNullWhen(true)] out Ty
9293
}
9394

9495
#if NET48
95-
public bool TryResolveClrMetadataType(string messageTypeName, out Type? type) {
96+
public bool TryResolveClrMetadataType(EventRecord record, out Type? type) {
9697
#else
97-
public bool TryResolveClrMetadataType(string messageTypeName, [NotNullWhen(true)] out Type? type) {
98+
public bool TryResolveClrMetadataType(EventRecord record, [NotNullWhen(true)] out Type? type) {
9899
#endif
99100
type = _defaultMetadataType;
100101
return true;

‎src/KurrentDB.Client/Core/Serialization/SchemaRegistry.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,18 @@ public string ResolveTypeName(Type messageType, MessageTypeNamingResolutionConte
3737
messageTypeNamingStrategy.ResolveTypeName(messageType, resolutionContext);
3838

3939
#if NET48
40-
public bool TryResolveClrType(string messageTypeName, out Type? type) =>
40+
public bool TryResolveClrType(EventRecord record, out Type? type) =>
4141
#else
42-
public bool TryResolveClrType(string messageTypeName, [NotNullWhen(true)] out Type? type) =>
42+
public bool TryResolveClrType(EventRecord record, [NotNullWhen(true)] out Type? type) =>
4343
#endif
44-
messageTypeNamingStrategy.TryResolveClrType(messageTypeName, out type);
44+
messageTypeNamingStrategy.TryResolveClrType(record, out type);
4545

4646
#if NET48
47-
public bool TryResolveClrMetadataType(string messageTypeName, out Type? type) =>
47+
public bool TryResolveClrMetadataType(EventRecord record, out Type? type) =>
4848
#else
49-
public bool TryResolveClrMetadataType(string messageTypeName, [NotNullWhen(true)] out Type? type) =>
49+
public bool TryResolveClrMetadataType(EventRecord record, [NotNullWhen(true)] out Type? type) =>
5050
#endif
51-
messageTypeNamingStrategy.TryResolveClrMetadataType(messageTypeName, out type);
51+
messageTypeNamingStrategy.TryResolveClrMetadataType(record, out type);
5252

5353
public static SchemaRegistry From(KurrentDBClientSerializationSettings settings) {
5454
var messageTypeNamingStrategy =

‎test/KurrentDB.Client.Tests/Core/Serialization/SchemaRegistryTests.cs

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,10 @@ public void From_WithMessageTypeMap_RegistersTypes() {
109109

110110
// Then
111111
// Verify types can be resolved
112-
Assert.True(registry.TryResolveClrType("test-event-1", out var type1));
112+
Assert.True(registry.TryResolveClrType(TestRecord("test-event-1"), out var type1));
113113
Assert.Equal(typeof(TestEvent1), type1);
114114

115-
Assert.True(registry.TryResolveClrType("test-event-2", out var type2));
115+
Assert.True(registry.TryResolveClrType(TestRecord("test-event-2"), out var type2));
116116
Assert.Equal(typeof(TestEvent2), type2);
117117
}
118118

@@ -165,13 +165,13 @@ public void From_WithCategoryMessageTypesMap_WithDefaultMessageAutoRegistration(
165165
Assert.Equal(expectedTypeName3, typeName3);
166166

167167
// Verify types can be resolved by the type names
168-
Assert.True(registry.TryResolveClrType(typeName1, out var resolvedType1));
168+
Assert.True(registry.TryResolveClrType(TestRecord(typeName1), out var resolvedType1));
169169
Assert.Equal(typeof(TestEvent1), resolvedType1);
170170

171-
Assert.True(registry.TryResolveClrType(typeName2, out var resolvedType2));
171+
Assert.True(registry.TryResolveClrType(TestRecord(typeName2), out var resolvedType2));
172172
Assert.Equal(typeof(TestEvent2), resolvedType2);
173173

174-
Assert.True(registry.TryResolveClrType(typeName3, out var resolvedType3));
174+
Assert.True(registry.TryResolveClrType(TestRecord(typeName3), out var resolvedType3));
175175
Assert.Equal(typeof(TestEvent3), resolvedType3);
176176
}
177177

@@ -205,13 +205,13 @@ public void From_WithCategoryMessageTypesMap_RegistersTypesWithCategories() {
205205
);
206206

207207
// Verify types can be resolved by the type names
208-
Assert.True(registry.TryResolveClrType(typeName1, out var resolvedType1));
208+
Assert.True(registry.TryResolveClrType(TestRecord(typeName1), out var resolvedType1));
209209
Assert.Equal(typeof(TestEvent1), resolvedType1);
210210

211-
Assert.True(registry.TryResolveClrType(typeName2, out var resolvedType2));
211+
Assert.True(registry.TryResolveClrType(TestRecord(typeName2), out var resolvedType2));
212212
Assert.Equal(typeof(TestEvent2), resolvedType2);
213213

214-
Assert.True(registry.TryResolveClrType(typeName3, out var resolvedType3));
214+
Assert.True(registry.TryResolveClrType(TestRecord(typeName3), out var resolvedType3));
215215
Assert.Equal(typeof(TestEvent3), resolvedType3);
216216
}
217217

@@ -250,34 +250,51 @@ public void From_WithNoMessageTypeNamingStrategy_UsesDefaultStrategy() {
250250

251251
// Then
252252
// The wrapped default strategy should use our metadata type
253-
Assert.True(registry.TryResolveClrMetadataType("some-type", out var defaultMetadataType));
253+
Assert.True(registry.TryResolveClrMetadataType(TestRecord("some-type"), out var defaultMetadataType));
254254

255255
Assert.Equal(typeof(TestMetadata), defaultMetadataType);
256256
}
257+
258+
static EventRecord TestRecord(
259+
string eventType
260+
) =>
261+
new(
262+
Uuid.NewUuid().ToString(),
263+
Uuid.NewUuid(),
264+
StreamPosition.FromInt64(0),
265+
new Position(1, 1),
266+
new Dictionary<string, string> {
267+
{ Constants.Metadata.Type, eventType },
268+
{ Constants.Metadata.Created, DateTime.UtcNow.ToTicksSinceEpoch().ToString() },
269+
{ Constants.Metadata.ContentType, Constants.Metadata.ContentTypes.ApplicationJson }
270+
},
271+
ReadOnlyMemory<byte>.Empty,
272+
ReadOnlyMemory<byte>.Empty
273+
);
257274

258275
// Custom naming strategy for testing
259276
class TestNamingStrategy : IMessageTypeNamingStrategy {
260277
public string ResolveTypeName(Type type, MessageTypeNamingResolutionContext context) {
261278
return $"Custom-{type.Name}-{context.CategoryName}";
262279
}
263280
#if NET48
264-
public bool TryResolveClrType(string messageTypeName, out Type? clrType)
281+
public bool TryResolveClrType(EventRecord record, out Type? clrType)
265282
#else
266-
public bool TryResolveClrType(string messageTypeName, [NotNullWhen(true)] out Type? clrType)
283+
public bool TryResolveClrType(EventRecord record, [NotNullWhen(true)] out Type? clrType)
267284
#endif
268285
{
269286
// Simple implementation for testing
270-
clrType = messageTypeName.StartsWith("Custom-TestEvent1")
287+
clrType = record.EventType.StartsWith("Custom-TestEvent1")
271288
? typeof(TestEvent1)
272289
: null;
273290

274291
return clrType != null;
275292
}
276293

277294
#if NET48
278-
public bool TryResolveClrMetadataType(string messageTypeName, out Type? clrType)
295+
public bool TryResolveClrMetadataType(EventRecord record, out Type? clrType)
279296
#else
280-
public bool TryResolveClrMetadataType(string messageTypeName, [NotNullWhen(true)] out Type? clrType)
297+
public bool TryResolveClrMetadataType(EventRecord record, [NotNullWhen(true)] out Type? clrType)
281298
#endif
282299
{
283300
clrType = typeof(TestMetadata);

‎test/KurrentDB.Client.Tests/Streams/Serialization/SerializationTests.PersistentSubscriptions.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -209,20 +209,21 @@ public string ResolveTypeName(Type messageType, MessageTypeNamingResolutionConte
209209
}
210210

211211
#if NET48
212-
public bool TryResolveClrType(string messageTypeName, out Type? type) {
212+
public bool TryResolveClrType(EventRecord record, out Type? type) {
213213
#else
214-
public bool TryResolveClrType(string messageTypeName, [NotNullWhen(true)] out Type? type) {
214+
public bool TryResolveClrType(EventRecord record, [NotNullWhen(true)] out Type? type) {
215215
#endif
216-
var typeName = messageTypeName[(messageTypeName.IndexOf('-') + 1)..];
216+
var messageTypeName = record.EventType;
217+
var typeName = messageTypeName[(messageTypeName.IndexOf('-') + 1)..];
217218
type = Type.GetType(typeName);
218219

219220
return type != null;
220221
}
221222

222223
#if NET48
223-
public bool TryResolveClrMetadataType(string messageTypeName, out Type? type) {
224+
public bool TryResolveClrMetadataType(EventRecord record, out Type? type) {
224225
#else
225-
public bool TryResolveClrMetadataType(string messageTypeName, [NotNullWhen(true)] out Type? type) {
226+
public bool TryResolveClrMetadataType(EventRecord record, [NotNullWhen(true)] out Type? type) {
226227
#endif
227228
type = null;
228229
return false;

‎test/KurrentDB.Client.Tests/Streams/Serialization/SerializationTests.Subscriptions.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System.Diagnostics.CodeAnalysis;
22
using System.Text;
33
using System.Text.Json;
4-
using KurrentDB.Client;
54
using KurrentDB.Client.Core.Serialization;
65
using Kurrent.Diagnostics.Tracing;
76

@@ -176,20 +175,21 @@ public string ResolveTypeName(Type messageType, MessageTypeNamingResolutionConte
176175
}
177176

178177
#if NET48
179-
public bool TryResolveClrType(string messageTypeName, out Type? type) {
178+
public bool TryResolveClrType(EventRecord record, out Type? type) {
180179
#else
181-
public bool TryResolveClrType(string messageTypeName, [NotNullWhen(true)] out Type? type) {
180+
public bool TryResolveClrType(EventRecord record, [NotNullWhen(true)] out Type? type) {
182181
#endif
183-
var typeName = messageTypeName[(messageTypeName.IndexOf('-') + 1)..];
182+
var messageTypeName = record.EventType;
183+
var typeName = messageTypeName[(messageTypeName.IndexOf('-') + 1)..];
184184
type = Type.GetType(typeName);
185185

186186
return type != null;
187187
}
188188

189189
#if NET48
190-
public bool TryResolveClrMetadataType(string messageTypeName, out Type? type) {
190+
public bool TryResolveClrMetadataType(EventRecord record, out Type? type) {
191191
#else
192-
public bool TryResolveClrMetadataType(string messageTypeName, [NotNullWhen(true)] out Type? type) {
192+
public bool TryResolveClrMetadataType(EventRecord record, [NotNullWhen(true)] out Type? type) {
193193
#endif
194194
type = null;
195195
return false;

‎test/KurrentDB.Client.Tests/Streams/Serialization/SerializationTests.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -222,20 +222,21 @@ public string ResolveTypeName(Type messageType, MessageTypeNamingResolutionConte
222222
}
223223

224224
#if NET48
225-
public bool TryResolveClrType(string messageTypeName, out Type? type) {
225+
public bool TryResolveClrType(EventRecord record, out Type? type) {
226226
#else
227-
public bool TryResolveClrType(string messageTypeName, [NotNullWhen(true)] out Type? type) {
227+
public bool TryResolveClrType(EventRecord record, [NotNullWhen(true)] out Type? type) {
228228
#endif
229-
var typeName = messageTypeName[(messageTypeName.IndexOf('-') + 1)..];
229+
var messageTypeName = record.EventType;
230+
var typeName = messageTypeName[(messageTypeName.IndexOf('-') + 1)..];
230231
type = Type.GetType(typeName);
231232

232233
return type != null;
233234
}
234235

235236
#if NET48
236-
public bool TryResolveClrMetadataType(string messageTypeName, out Type? type) {
237+
public bool TryResolveClrMetadataType(EventRecord record, out Type? type) {
237238
#else
238-
public bool TryResolveClrMetadataType(string messageTypeName, [NotNullWhen(true)] out Type? type) {
239+
public bool TryResolveClrMetadataType(EventRecord record, [NotNullWhen(true)] out Type? type) {
239240
#endif
240241
type = null;
241242
return false;

0 commit comments

Comments
 (0)