Skip to content

Commit dc33112

Browse files
committed
Passing domain in serializer registry
1 parent 98682bb commit dc33112

File tree

6 files changed

+45
-23
lines changed

6 files changed

+45
-23
lines changed

src/MongoDB.Bson/Serialization/BsonClassMapSerializationProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public override IBsonSerializer GetSerializer(Type type, IBsonSerializerRegistry
4141
!typeof(Array).GetTypeInfo().IsAssignableFrom(type) &&
4242
!typeof(Enum).GetTypeInfo().IsAssignableFrom(type))
4343
{
44-
var classMap = BsonClassMap.LookupClassMap(type); //TODO We need to find a way to pass the domain here
44+
var classMap = serializerRegistry.SerializationDomain.BsonClassMap.LookupClassMap(type);
4545
var classMapSerializerDefinition = typeof(BsonClassMapSerializer<>);
4646
var classMapSerializerType = classMapSerializerDefinition.MakeGenericType(type);
4747
return (IBsonSerializer)Activator.CreateInstance(classMapSerializerType, classMap);

src/MongoDB.Bson/Serialization/BsonSerializationDomain.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -798,7 +798,7 @@ public void Dispose()
798798
// private methods
799799
private void CreateSerializerRegistry()
800800
{
801-
_serializerRegistry = new BsonSerializerRegistry();
801+
_serializerRegistry = new BsonSerializerRegistry(this);
802802
_typeMappingSerializationProvider = new TypeMappingSerializationProvider();
803803

804804
// order matters. It's in reverse order of how they'll get consumed

src/MongoDB.Bson/Serialization/BsonSerializerRegistry.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,35 @@ public sealed class BsonSerializerRegistry : IBsonSerializerRegistry
2828
private readonly ConcurrentDictionary<Type, IBsonSerializer> _cache;
2929
private readonly ConcurrentStack<IBsonSerializationProvider> _serializationProviders;
3030
private readonly Func<Type, IBsonSerializer> _createSerializer;
31+
private readonly IBsonSerializationDomain _serializationDomain;
3132

3233
// constructors
3334
/// <summary>
3435
/// Initializes a new instance of the <see cref="BsonSerializerRegistry"/> class.
3536
/// </summary>
36-
public BsonSerializerRegistry()
37+
public BsonSerializerRegistry():
38+
this(BsonSerializer.DefaultDomain)
39+
{
40+
}
41+
42+
/// <summary>
43+
/// //TODO
44+
/// </summary>
45+
/// <param name="serializationDomain"></param>
46+
public BsonSerializerRegistry(IBsonSerializationDomain serializationDomain)
3747
{
3848
_cache = new ConcurrentDictionary<Type, IBsonSerializer>();
3949
_serializationProviders = new ConcurrentStack<IBsonSerializationProvider>();
4050
_createSerializer = CreateSerializer;
51+
_serializationDomain = serializationDomain;
4152
}
4253

4354
// public methods
55+
/// <summary>
56+
/// //TODO
57+
/// </summary>
58+
public IBsonSerializationDomain SerializationDomain => _serializationDomain;
59+
4460
/// <summary>
4561
/// Gets the serializer for the specified <paramref name="type" />.
4662
/// If none is already registered, the serialization providers will be used to create a serializer and it will be automatically registered.

src/MongoDB.Bson/Serialization/IBsonSerializerRegistry.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ namespace MongoDB.Bson.Serialization
2222
/// </summary>
2323
public interface IBsonSerializerRegistry
2424
{
25+
/// <summary>
26+
/// //TODO
27+
/// </summary>
28+
public IBsonSerializationDomain SerializationDomain { get; }
29+
2530
/// <summary>
2631
/// Gets the serializer for the specified <paramref name="type"/>.
2732
/// </summary>

src/MongoDB.Driver/MongoCollectionSettings.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public ReadPreference ReadPreference
117117
/// <summary>
118118
/// Gets the serializer registry.
119119
/// </summary>
120-
public IBsonSerializerRegistry SerializerRegistry => SerializationDomain.SerializerRegistry;
120+
public IBsonSerializerRegistry SerializerRegistry => SerializationDomain.SerializerRegistry; //TODO We should try passing down the domain instead of the registry...
121121

122122
/// <summary>
123123
/// //TODO

tests/MongoDB.Driver.Tests/MultipleRegistriesTests.cs

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -27,25 +27,26 @@ public class MultipleRegistriesTests
2727
[Fact]
2828
public void TestSerialization()
2929
{
30-
// At the moment having this uncommented would make the test fail due to the static caching of class maps
31-
// {
32-
// var client = DriverTestConfiguration.CreateMongoClient();
33-
// var db = client.GetDatabase(DriverTestConfiguration.DatabaseNamespace.DatabaseName);
34-
// db.DropCollection(DriverTestConfiguration.CollectionNamespace.CollectionName);
35-
// var collection = db.GetCollection<Person>(DriverTestConfiguration.CollectionNamespace.CollectionName);
36-
// var bsonCollection =
37-
// db.GetCollection<BsonDocument>(DriverTestConfiguration.CollectionNamespace.CollectionName);
38-
//
39-
// var person = new Person { Id = ObjectId.Parse("6797b56bf5495bf53aa3078f"), Name = "Mario", Age = 24 };
40-
// collection.InsertOne(person);
41-
//
42-
// var retrieved = bsonCollection.FindSync("{}").ToList().Single();
43-
// var toString = retrieved.ToString();
44-
//
45-
// var expectedVal =
46-
// """{ "_id" : { "$oid" : "6797b56bf5495bf53aa3078f" }, "Name" : "Mario", "Age" : 24 }""";
47-
// Assert.Equal(expectedVal, toString);
48-
// }
30+
{
31+
var client = DriverTestConfiguration.CreateMongoClient();
32+
var db = client.GetDatabase(DriverTestConfiguration.DatabaseNamespace.DatabaseName);
33+
db.DropCollection(DriverTestConfiguration.CollectionNamespace.CollectionName);
34+
var collection = db.GetCollection<Person>(DriverTestConfiguration.CollectionNamespace.CollectionName);
35+
var bsonCollection =
36+
db.GetCollection<BsonDocument>(DriverTestConfiguration.CollectionNamespace.CollectionName);
37+
38+
var person = new Person { Id = ObjectId.Parse("6797b56bf5495bf53aa3078f"), Name = "Mario", Age = 24 };
39+
collection.InsertOne(person);
40+
41+
var retrieved = bsonCollection.FindSync("{}").ToList().Single();
42+
var toString = retrieved.ToString();
43+
44+
var expectedVal =
45+
"""{ "_id" : { "$oid" : "6797b56bf5495bf53aa3078f" }, "Name" : "Mario", "Age" : 24 }""";
46+
Assert.Equal(expectedVal, toString);
47+
}
48+
49+
//The first section demonstrates that the class maps are also separated
4950

5051
{
5152
var customDomain = BsonSerializer.CreateDomain();

0 commit comments

Comments
 (0)