From e07b02a50efdb7e841ab361fd11c23e607634ab5 Mon Sep 17 00:00:00 2001 From: Oskar Dudycz Date: Wed, 29 Jan 2025 11:32:56 +0100 Subject: [PATCH] [DEVEX-222] Made CLR type be resolved based on the message type metadata header --- .../MessageTypeResolutionStrategy.cs | 15 +++++++++++++-- .../Core/Serialization/TypeProvider.cs | 4 ++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/Kurrent.Client/Core/Serialization/MessageTypeResolutionStrategy.cs b/src/Kurrent.Client/Core/Serialization/MessageTypeResolutionStrategy.cs index 87442056e..04cdc2f69 100644 --- a/src/Kurrent.Client/Core/Serialization/MessageTypeResolutionStrategy.cs +++ b/src/Kurrent.Client/Core/Serialization/MessageTypeResolutionStrategy.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using Kurrent.Client.Tests.Streams.Serialization; +using EventStore.Client.Diagnostics; namespace EventStore.Client.Serialization; @@ -19,7 +20,7 @@ public string ResolveTypeName(object messageData) { return messageTypeMapper.GetOrAddTypeName( messageData.GetType(), clrType => clrType.FullName! - )!; + ); } #if NET48 @@ -29,7 +30,17 @@ public bool TryResolveClrType(EventRecord messageRecord, [NotNullWhen(true)] out #endif type = messageTypeMapper.GetOrAddClrType( messageRecord.EventType, - TypeProvider.GetFirstMatchingTypeFromCurrentDomainAssembly + _ => { + var serializationMetadata = messageRecord.Metadata.ExtractSerializationMetadata(); + + if (!serializationMetadata.IsValid) + return null; + + return Type.GetType( + serializationMetadata.MessageTypeAssemblyQualifiedName + ?? serializationMetadata.MessageTypeClrTypeName! + ); + } ); return type != null; diff --git a/src/Kurrent.Client/Core/Serialization/TypeProvider.cs b/src/Kurrent.Client/Core/Serialization/TypeProvider.cs index a4d7ec20e..880a5701c 100644 --- a/src/Kurrent.Client/Core/Serialization/TypeProvider.cs +++ b/src/Kurrent.Client/Core/Serialization/TypeProvider.cs @@ -15,12 +15,12 @@ public static class TypeProvider return AppDomain.CurrentDomain.GetAssemblies() .Where(a => referencedAssemblies.Contains(a.FullName)) - .SelectMany(a => a.GetTypes().Where(x => x.FullName == typeName || x.Name == typeName)) + .SelectMany(a => a.GetTypes().Where(x => x.AssemblyQualifiedName == typeName || x.Name == typeName)) .FirstOrDefault(); } public static Type? GetFirstMatchingTypeFromCurrentDomainAssembly(string typeName) => AppDomain.CurrentDomain.GetAssemblies() - .SelectMany(a => a.GetTypes().Where(x => x.FullName == typeName || x.Name == typeName)) + .SelectMany(a => a.GetTypes().Where(x => x.AssemblyQualifiedName == typeName || x.Name == typeName)) .FirstOrDefault(); }