Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 26 additions & 35 deletions src/NServiceBus.Storage.MongoDB/Outbox/OutboxStorage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,53 +57,44 @@ internal static bool RegisterOutboxClassMappings()
// If any of the class maps are already registered, then we assume that the user has provided their own custom class maps
// and treat the entire tree as custom.
var usesDefaultClassMap = true;
if (!BsonClassMap.IsClassMapRegistered(typeof(OutboxRecordId)))
{
BsonClassMap.RegisterClassMap<OutboxRecordId>(cm =>
{
cm.AutoMap();
cm.MapMember(x => x.PartitionKey).SetElementName("pk");
cm.MapMember(x => x.MessageId).SetElementName("mid");
});
}
else

if (!TryRegisterOutboxRecordId())
{
usesDefaultClassMap = false;
}

if (!BsonClassMap.IsClassMapRegistered(typeof(OutboxRecord)))
{
BsonClassMap.RegisterClassMap<OutboxRecord>(cm =>
{
cm.AutoMap();
cm.MapIdMember(x => x.Id).SetSerializer(new OutboxRecordIdSerializer());
});
}
else
if (!TryRegisterOutboxRecord())
{
usesDefaultClassMap = false;
}

if (!BsonClassMap.IsClassMapRegistered(typeof(StorageTransportOperation)))
{
BsonClassMap.RegisterClassMap<StorageTransportOperation>(cm =>
{
cm.AutoMap();
cm.MapMember(c => c.Headers)
.SetSerializer(
new DictionaryInterfaceImplementerSerializer<Dictionary<string, string>>(
DictionaryRepresentation.ArrayOfDocuments));
cm.MapMember(c => c.Options)
.SetSerializer(
new DictionaryInterfaceImplementerSerializer<Dictionary<string, string>>(
DictionaryRepresentation.ArrayOfDocuments));
});
}
else
if (!TryRegisterStorageTransportOperation())
{
usesDefaultClassMap = false;
}

return usesDefaultClassMap;
}

static bool TryRegisterOutboxRecordId() => BsonClassMap.TryRegisterClassMap<OutboxRecordId>(cm =>
{
cm.AutoMap();
cm.MapMember(x => x.PartitionKey).SetElementName("pk");
cm.MapMember(x => x.MessageId).SetElementName("mid");
});

static bool TryRegisterOutboxRecord() => BsonClassMap.TryRegisterClassMap<OutboxRecord>(cm =>
{
cm.AutoMap();
cm.MapIdMember(x => x.Id).SetSerializer(new OutboxRecordIdSerializer());
});

static bool TryRegisterStorageTransportOperation() => BsonClassMap.TryRegisterClassMap<StorageTransportOperation>(cm =>
{
cm.AutoMap();
cm.MapMember(c => c.Headers)
.SetSerializer(new DictionaryInterfaceImplementerSerializer<Dictionary<string, string>>(DictionaryRepresentation.ArrayOfDocuments));
cm.MapMember(c => c.Options)
.SetSerializer(new DictionaryInterfaceImplementerSerializer<Dictionary<string, string>>(DictionaryRepresentation.ArrayOfDocuments));
});
}
21 changes: 15 additions & 6 deletions src/NServiceBus.Storage.MongoDB/Sagas/SagaStorage.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
namespace NServiceBus.Storage.MongoDB;

using System.Collections.Generic;
using System.Threading;
using Features;
using global::MongoDB.Bson.Serialization;
using Microsoft.Extensions.DependencyInjection;
Expand Down Expand Up @@ -45,18 +46,23 @@ internal readonly struct MappingMetadata(string sagaEntity, bool usesDefaultClas
internal static IReadOnlyCollection<MappingMetadata> RegisterSagaEntityClassMappings(SagaMetadataCollection sagaMetadataCollection, MemberMapCache memberMapCache)
{
var sagaEntityToClassMapDiagnostics = new List<MappingMetadata>();

foreach (var sagaMetadata in sagaMetadataCollection)
{
var usesDefaultClassMap = false;
if (!BsonClassMap.IsClassMapRegistered(sagaMetadata.SagaEntityType))

lock (classMapLock)
{
var classMap = new BsonClassMap(sagaMetadata.SagaEntityType);
classMap.AutoMap();
classMap.SetIgnoreExtraElements(true);
if (!BsonClassMap.IsClassMapRegistered(sagaMetadata.SagaEntityType))
{
var classMap = new BsonClassMap(sagaMetadata.SagaEntityType);
classMap.AutoMap();
classMap.SetIgnoreExtraElements(true);

BsonClassMap.RegisterClassMap(classMap);
BsonClassMap.RegisterClassMap(classMap);

usesDefaultClassMap = true;
usesDefaultClassMap = true;
}
}

sagaEntityToClassMapDiagnostics.Add(new(sagaMetadata.SagaEntityType.FullName!, usesDefaultClassMap));
Expand All @@ -66,6 +72,9 @@ internal static IReadOnlyCollection<MappingMetadata> RegisterSagaEntityClassMapp
_ = memberMapCache.GetOrAdd(sagaMetadata.SagaEntityType, property);
}
}

return sagaEntityToClassMapDiagnostics;
}

static readonly Lock classMapLock = new();
}