Skip to content

Commit

Permalink
BREAKING: Update MongoDB provider with support for object derivatives
Browse files Browse the repository at this point in the history
Fixes #552
  • Loading branch information
sfmskywalker committed May 27, 2021
1 parent 985fd39 commit 45b0f84
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@

namespace Elsa.Persistence.MongoDb.Serializers
{
public class JsonSerializer : IBsonSerializer<JObject>
public class JObjectSerializer : IBsonSerializer<JObject>
{
public static JsonSerializer Instance { get; } = new();
public static JObjectSerializer Instance { get; } = new();

private readonly JsonSerializerSettings _serializerSettings = new JsonSerializerSettings
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using System;
using MongoDB.Bson.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NodaTime;
using NodaTime.Serialization.JsonNet;

namespace Elsa.Persistence.MongoDb.Serializers
{
public class ObjectSerializer : IBsonSerializer<object>
{
public static ObjectSerializer Instance { get; } = new();

private readonly JsonSerializerSettings _serializerSettings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple,
TypeNameHandling = TypeNameHandling.Auto,
}.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);

public Type ValueType => typeof(object);

public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
{
var json = JsonConvert.SerializeObject(value, _serializerSettings);
context.Writer.WriteString(json);
}

object IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) => Deserialize(context, args);

public object Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
var text = context.Reader.ReadString();
return JsonConvert.DeserializeObject<object>(text, _serializerSettings)!;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@

namespace Elsa.Persistence.MongoDb.Services
{
public static class DatabaseRegister
{
public static class DatabaseRegister
{
public static void RegisterMapsAndSerializers()
{
// In unit tests, the method is called several times, which throws an exception because the entity is already registered
// If an error is thrown, the remaining registrations are no longer processed
var firstPass = Map();
if(firstPass == false)

if (firstPass == false)
return;

RegisterSerializers();
Expand All @@ -33,18 +33,13 @@ private static bool Map()
cm.MapIdProperty(x => x.Id);
});

BsonClassMap.RegisterClassMap<WorkflowDefinition>(cm =>
{
cm.AutoMap();
});

BsonClassMap.RegisterClassMap<WorkflowInstance>(cm =>
{
cm.AutoMap();
});

BsonClassMap.RegisterClassMap<WorkflowDefinition>(cm => cm.AutoMap());
BsonClassMap.RegisterClassMap<WorkflowInstance>(cm => cm.AutoMap());
BsonClassMap.RegisterClassMap<Bookmark>(cm => cm.AutoMap());
BsonClassMap.RegisterClassMap<WorkflowExecutionLogRecord>(cm => cm.AutoMap());
}
catch (Exception) {
catch (Exception)
{
return false;
}

Expand All @@ -53,8 +48,9 @@ private static bool Map()

private static void RegisterSerializers()
{
BsonSerializer.RegisterSerializer(JsonSerializer.Instance);
BsonSerializer.RegisterSerializer(JObjectSerializer.Instance);
BsonSerializer.RegisterSerializer(ObjectSerializer.Instance);
BsonSerializer.RegisterSerializer(new InstantSerializer());
}
}
}
}

0 comments on commit 45b0f84

Please sign in to comment.