Skip to content

Commit 4e88a61

Browse files
committed
[DEVEX-222] Added the MessageTypeResolutionStrategyWrapper for caching resolved types
1 parent e07b02a commit 4e88a61

File tree

2 files changed

+37
-15
lines changed

2 files changed

+37
-15
lines changed

src/Kurrent.Client/Core/Serialization/MessageTypeResolutionStrategy.cs

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@ public interface IMessageTypeResolutionStrategy {
1414
#endif
1515
}
1616

17-
public class DefaultMessageTypeResolutionStrategy(IMessageTypeMapper messageTypeMapper)
18-
: IMessageTypeResolutionStrategy {
17+
public class MessageTypeResolutionStrategyWrapper(
18+
IMessageTypeMapper messageTypeMapper,
19+
IMessageTypeResolutionStrategy messageTypeResolutionStrategy
20+
) : IMessageTypeResolutionStrategy {
1921
public string ResolveTypeName(object messageData) {
2022
return messageTypeMapper.GetOrAddTypeName(
2123
messageData.GetType(),
22-
clrType => clrType.FullName!
24+
_ => messageTypeResolutionStrategy.ResolveTypeName(messageData)
2325
);
2426
}
2527

@@ -30,18 +32,36 @@ public bool TryResolveClrType(EventRecord messageRecord, [NotNullWhen(true)] out
3032
#endif
3133
type = messageTypeMapper.GetOrAddClrType(
3234
messageRecord.EventType,
33-
_ => {
34-
var serializationMetadata = messageRecord.Metadata.ExtractSerializationMetadata();
35+
_ => messageTypeResolutionStrategy.TryResolveClrType(messageRecord, out var resolvedType)
36+
? resolvedType
37+
: null
38+
);
39+
40+
return type != null;
41+
}
42+
}
3543

36-
if (!serializationMetadata.IsValid)
37-
return null;
44+
public class DefaultMessageTypeResolutionStrategy
45+
: IMessageTypeResolutionStrategy {
46+
public string ResolveTypeName(object messageData) =>
47+
messageData.GetType().FullName!;
3848

39-
return Type.GetType(
40-
serializationMetadata.MessageTypeAssemblyQualifiedName
41-
?? serializationMetadata.MessageTypeClrTypeName!
42-
);
43-
}
44-
);
49+
#if NET48
50+
public bool TryResolveClrType(EventRecord messageRecord, out Type? type) {
51+
#else
52+
public bool TryResolveClrType(EventRecord messageRecord, [NotNullWhen(true)] out Type? type) {
53+
#endif
54+
var serializationMetadata = messageRecord.Metadata.ExtractSerializationMetadata();
55+
56+
if (!serializationMetadata.IsValid) {
57+
type = null;
58+
return false;
59+
}
60+
61+
type = Type.GetType(serializationMetadata.MessageTypeAssemblyQualifiedName!)
62+
?? TypeProvider.GetFirstMatchingTypeFromCurrentDomainAssembly(
63+
serializationMetadata.MessageTypeClrTypeName!
64+
);
4565

4666
return type != null;
4767
}

src/Kurrent.Client/Core/Serialization/SchemaRegistry.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,10 @@ public static SchemaRegistry From(KurrentClientSerializationSettings settings) {
3939
var jsonSerializer = settings.JsonSerializer ?? new SystemTextJsonSerializer();
4040
var bytesSerializer = settings.BytesSerializer ?? new SystemTextJsonSerializer();
4141

42-
var messageTypeResolutionStrategy =
43-
settings.MessageTypeResolutionStrategy ?? new DefaultMessageTypeResolutionStrategy(MessageTypeMapper.Instance);
42+
var messageTypeResolutionStrategy = new MessageTypeResolutionStrategyWrapper(
43+
MessageTypeMapper.Instance,
44+
settings.MessageTypeResolutionStrategy ?? new DefaultMessageTypeResolutionStrategy()
45+
);
4446

4547
var serializers = new Dictionary<ContentType, MessageSerializer> {
4648
{

0 commit comments

Comments
 (0)