Skip to content

Commit 76665ec

Browse files
committed
Fix some tests and throw an exception when trying to register an object in one domain that belongs to a different domain.
1 parent a541b08 commit 76665ec

15 files changed

+70
-17
lines changed

src/MongoDB.Bson/Serialization/BsonClassMap.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ namespace MongoDB.Bson.Serialization
2929
/// <summary>
3030
/// Represents a mapping between a class and a BSON document.
3131
/// </summary>
32-
public class BsonClassMap
32+
public class BsonClassMap : IHasSerializationDomain
3333
{
3434
// private fields
3535
private readonly Type _classType;
@@ -263,6 +263,8 @@ internal int ExtraElementsMemberMapIndex
263263

264264
internal IBsonSerializationDomain SerializationDomain => _serializationDomain;
265265

266+
IBsonSerializationDomain IHasSerializationDomain.SerializationDomain => _serializationDomain;
267+
266268
// public static methods
267269
/// <summary>
268270
/// Gets all registered class maps.
@@ -858,7 +860,7 @@ public BsonMemberMap MapMember(MemberInfo memberInfo)
858860
var memberMap = _declaredMemberMaps.Find(m => m.MemberInfo == memberInfo);
859861
if (memberMap == null)
860862
{
861-
memberMap = new BsonMemberMap(this, memberInfo);
863+
memberMap = new BsonMemberMap(_serializationDomain, this, memberInfo);
862864
_declaredMemberMaps.Add(memberMap);
863865
}
864866
return memberMap;

src/MongoDB.Bson/Serialization/BsonClassMapRegistry.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
namespace MongoDB.Bson.Serialization;
2222

23-
internal class BsonClassMapRegistry : IBsonClassMapRegistry
23+
internal class BsonClassMapRegistry : IBsonClassMapRegistry, IHasSerializationDomain
2424
{
2525
// private fields
2626
private readonly Dictionary<Type, BsonClassMap> _classMaps = new();
@@ -31,6 +31,8 @@ public BsonClassMapRegistry(BsonSerializationDomain serializationDomain)
3131
_serializationDomain = serializationDomain;
3232
}
3333

34+
IBsonSerializationDomain IHasSerializationDomain.SerializationDomain => _serializationDomain;
35+
3436
/// <summary>
3537
/// Gets all registered class maps.
3638
/// </summary>
@@ -142,7 +144,7 @@ public BsonClassMap<TClass> RegisterClassMap<TClass>()
142144
/// <returns>The class map.</returns>
143145
public BsonClassMap<TClass> RegisterClassMap<TClass>(Action<BsonClassMap<TClass>> classMapInitializer)
144146
{
145-
var classMap = new BsonClassMap<TClass>(classMapInitializer);
147+
var classMap = new BsonClassMap<TClass>(_serializationDomain, classMapInitializer);
146148
RegisterClassMap(classMap);
147149
return classMap;
148150
}
@@ -158,6 +160,11 @@ public void RegisterClassMap(BsonClassMap classMap)
158160
throw new ArgumentNullException("classMap");
159161
}
160162

163+
if (classMap.SerializationDomain != _serializationDomain)
164+
{
165+
throw new ArgumentException($"Expected class map to be for serialization domain {_serializationDomain.Name}, but was for serialization domain {classMap.SerializationDomain.Name}.");
166+
}
167+
161168
_serializationDomain.ConfigLock.EnterWriteLock();
162169
try
163170
{

src/MongoDB.Bson/Serialization/BsonClassMapSerializationProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ namespace MongoDB.Bson.Serialization
2121
/// <summary>
2222
/// Represents the class map serialization provider.
2323
/// </summary>
24-
internal class BsonClassMapSerializationProvider : BsonSerializationProviderBase
24+
internal class BsonClassMapSerializationProvider : BsonSerializationProviderBase, IHasSerializationDomain
2525
{
2626
private readonly IBsonSerializationDomain _serializationDomain;
2727

src/MongoDB.Bson/Serialization/BsonMemberMap.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ namespace MongoDB.Bson.Serialization
2323
/// <summary>
2424
/// Represents the mapping between a field or property and a BSON element.
2525
/// </summary>
26-
public class BsonMemberMap
26+
public class BsonMemberMap : IHasSerializationDomain
2727
{
2828
// private fields
2929
private readonly BsonClassMap _classMap;
@@ -141,6 +141,8 @@ public Func<object, object> Getter
141141
}
142142
}
143143

144+
IBsonSerializationDomain IHasSerializationDomain.SerializationDomain => _serializationDomain;
145+
144146
/// <summary>
145147
/// Gets the setter function.
146148
/// </summary>

src/MongoDB.Bson/Serialization/BsonSerializationDomain.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,11 @@ public void RegisterDiscriminatorConvention(Type type, IDiscriminatorConvention
692692
{
693693
if (!_discriminatorConventions.ContainsKey(type))
694694
{
695+
if (convention is IHasSerializationDomain hasSerializationDomain && hasSerializationDomain.SerializationDomain != this)
696+
{
697+
throw new ArgumentException($"Expected discriminator convention to be for serialization domain {Name} but was for serialization domain {hasSerializationDomain.SerializationDomain.Name}.");
698+
}
699+
695700
_discriminatorConventions.Add(type, convention);
696701
}
697702
else

src/MongoDB.Bson/Serialization/BsonSerializerRegistry.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ namespace MongoDB.Bson.Serialization
2222
/// <summary>
2323
/// Default, global implementation of an <see cref="IBsonSerializerRegistry"/>.
2424
/// </summary>
25-
public sealed class BsonSerializerRegistry : IBsonSerializerRegistry
25+
public sealed class BsonSerializerRegistry : IBsonSerializerRegistry, IHasSerializationDomain
2626
{
2727
// private fields
2828
private readonly ConcurrentDictionary<Type, IBsonSerializer> _cache;
@@ -49,6 +49,8 @@ internal BsonSerializerRegistry(IBsonSerializationDomain domain)
4949

5050
internal IBsonSerializationDomain SerializationDomain => _serializationDomain;
5151

52+
IBsonSerializationDomain IHasSerializationDomain.SerializationDomain => _serializationDomain;
53+
5254
// public methods
5355
/// <summary>
5456
/// Gets the serializer for the specified <paramref name="type" />.
@@ -103,6 +105,10 @@ public void RegisterSerializer(Type type, IBsonSerializer serializer)
103105
throw new ArgumentNullException("serializer");
104106
}
105107
EnsureRegisteringASerializerForThisTypeIsAllowed(type);
108+
if (serializer is IHasSerializationDomain hasSerializationDomain && hasSerializationDomain.SerializationDomain != _serializationDomain)
109+
{
110+
throw new ArgumentException($"Expected serializer to be for serialization domain {_serializationDomain.Name} but was for serialization domain {hasSerializationDomain.SerializationDomain.Name}.");
111+
}
106112

107113
if (!_cache.TryAdd(type, serializer))
108114
{
@@ -143,6 +149,10 @@ public bool TryRegisterSerializer(Type type, IBsonSerializer serializer)
143149
throw new ArgumentNullException(nameof(serializer));
144150
}
145151
EnsureRegisteringASerializerForThisTypeIsAllowed(type);
152+
if (serializer is IHasSerializationDomain hasSerializationDomain && hasSerializationDomain.SerializationDomain != _serializationDomain)
153+
{
154+
throw new ArgumentException($"Expected serializer to be for serialization domain {_serializationDomain.Name} but was for serialization domain {hasSerializationDomain.SerializationDomain.Name}.");
155+
}
146156

147157
if (_cache.TryAdd(type, serializer))
148158
{
@@ -179,6 +189,11 @@ private IBsonSerializer CreateSerializer(Type type)
179189

180190
if (serializer != null)
181191
{
192+
if (serializer is IHasSerializationDomain hasSerializationDomain && hasSerializationDomain.SerializationDomain != _serializationDomain)
193+
{
194+
throw new ArgumentException($"Expected serializer to be for serialization domain {_serializationDomain.Name} but was for serialization domain {hasSerializationDomain.SerializationDomain.Name}.", "serializer");
195+
}
196+
182197
return serializer;
183198
}
184199
}

src/MongoDB.Bson/Serialization/Conventions/ConventionPack.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,24 @@ namespace MongoDB.Bson.Serialization.Conventions
2222
/// <summary>
2323
/// A mutable pack of conventions.
2424
/// </summary>
25-
public class ConventionPack : IConventionPack, IEnumerable<IConvention>
25+
public class ConventionPack : IConventionPack, IEnumerable<IConvention>, IHasSerializationDomain
2626
{
2727
// private fields
2828
private readonly List<IConvention> _conventions;
29+
private readonly IBsonSerializationDomain _serializationDomain;
2930

3031
// constructors
3132
/// <summary>
3233
/// Initializes a new instance of the <see cref="ConventionPack" /> class.
3334
/// </summary>
3435
public ConventionPack()
36+
: this(BsonSerializationDomain.Default)
3537
{
38+
}
39+
40+
internal ConventionPack(IBsonSerializationDomain serializationDomain)
41+
{
42+
_serializationDomain = serializationDomain;
3643
_conventions = new List<IConvention>();
3744
}
3845

@@ -45,6 +52,8 @@ public IEnumerable<IConvention> Conventions
4552
get { return _conventions; }
4653
}
4754

55+
IBsonSerializationDomain IHasSerializationDomain.SerializationDomain => _serializationDomain;
56+
4857
// public methods
4958
/// <summary>
5059
/// Adds the specified convention.

src/MongoDB.Bson/Serialization/Conventions/ConventionRegistryInstance.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
namespace MongoDB.Bson.Serialization.Conventions
2020
{
21-
internal class ConventionRegistryInstance : IConventionRegistry
21+
internal class ConventionRegistryInstance : IConventionRegistry, IHasSerializationDomain
2222
{
2323
private readonly List<ConventionPackContainer> _conventionPacks = new();
2424
private readonly object _lock = new();
@@ -34,6 +34,8 @@ internal ConventionRegistryInstance(IBsonSerializationDomain serializationDomain
3434
Register("__attributes__", AttributeConventionPack.Instance, t => true);
3535
}
3636

37+
IBsonSerializationDomain IHasSerializationDomain.SerializationDomain => _serializationDomain;
38+
3739
// public static methods
3840
/// <summary>
3941
/// Looks up the effective set of conventions that apply to a type.
@@ -49,7 +51,7 @@ public IConventionPack Lookup(Type type)
4951

5052
lock (_lock)
5153
{
52-
var pack = new ConventionPack();
54+
var pack = new ConventionPack(_serializationDomain);
5355

5456
// append any attribute packs (usually just one) at the end so attributes are processed last
5557
var attributePacks = new List<IConventionPack>();
@@ -101,6 +103,11 @@ public void Register(string name, IConventionPack conventions, Func<Type, bool>
101103
throw new ArgumentNullException("filter");
102104
}
103105

106+
if (conventions is IHasSerializationDomain hasSerializationDomain && hasSerializationDomain.SerializationDomain != _serializationDomain)
107+
{
108+
throw new ArgumentException($"Expected convention pack to be for serialization domain {_serializationDomain.Name}, but was for serialization domain {hasSerializationDomain.SerializationDomain.Name}.");
109+
}
110+
104111
lock (_lock)
105112
{
106113
var container = new ConventionPackContainer

src/MongoDB.Bson/Serialization/Conventions/LookupIdGeneratorConvention.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ namespace MongoDB.Bson.Serialization.Conventions
2121
/// <summary>
2222
/// A convention that looks up an id generator for the id member.
2323
/// </summary>
24-
public class LookupIdGeneratorConvention : ConventionBase, IPostProcessingConvention
24+
public class LookupIdGeneratorConvention : ConventionBase, IPostProcessingConvention, IHasSerializationDomain
2525
{
2626
private readonly IBsonSerializationDomain _serializationDomain;
2727

@@ -38,6 +38,8 @@ internal LookupIdGeneratorConvention(IBsonSerializationDomain serializationDomai
3838
_serializationDomain = serializationDomain;
3939
}
4040

41+
IBsonSerializationDomain IHasSerializationDomain.SerializationDomain => _serializationDomain;
42+
4143
// public methods
4244
/// <summary>
4345
/// Applies a post processing modification to the class map.

src/MongoDB.Bson/Serialization/Conventions/ObjectDiscriminatorConvention.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace MongoDB.Bson.Serialization.Conventions
2424
/// <summary>
2525
/// Represents the object discriminator convention.
2626
/// </summary>
27-
public class ObjectDiscriminatorConvention : IDiscriminatorConvention
27+
public class ObjectDiscriminatorConvention : IDiscriminatorConvention, IHasSerializationDomain
2828
{
2929
// private static fields
3030
private static ObjectDiscriminatorConvention __instance = new ObjectDiscriminatorConvention("_t");
@@ -80,6 +80,8 @@ public string ElementName
8080
get { return _elementName; }
8181
}
8282

83+
IBsonSerializationDomain IHasSerializationDomain.SerializationDomain => _serializationDomain;
84+
8385
// public methods
8486
/// <inheritdoc/>
8587
public override bool Equals(object obj)

0 commit comments

Comments
 (0)