Skip to content

Commit 5f09edc

Browse files
committed
Fixed registry
1 parent 1de0aa2 commit 5f09edc

File tree

6 files changed

+32
-38
lines changed

6 files changed

+32
-38
lines changed

src/MongoDB.Bson/Serialization/AttributedSerializationProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
namespace MongoDB.Bson.Serialization
2222
{
23+
//DOMAIN-API We should consider making all our serialization provider classes sealed or internal.
2324
/// <summary>
2425
/// Provides serializers based on an attribute.
2526
/// </summary>

src/MongoDB.Bson/Serialization/BsonClassMapSerializationProvider.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,21 @@ 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, IDomainAwareBsonSerializationProvider
2525
{
26+
public IBsonSerializationDomain SerializationDomain { get; }
27+
28+
public BsonClassMapSerializationProvider(IBsonSerializationDomain serializationDomain)
29+
{
30+
SerializationDomain = serializationDomain;
31+
}
32+
33+
//DOMAIN-API This method should be removed.
2634
/// <inheritdoc/>
2735
public override IBsonSerializer GetSerializer(Type type, IBsonSerializerRegistry serializerRegistry)
36+
=> GetSerializerWithDomain(type);
37+
38+
public IBsonSerializer GetSerializerWithDomain(Type type)
2839
{
2940
if (type == null)
3041
{
@@ -41,18 +52,7 @@ public override IBsonSerializer GetSerializer(Type type, IBsonSerializerRegistry
4152
!typeof(Array).GetTypeInfo().IsAssignableFrom(type) &&
4253
!typeof(Enum).GetTypeInfo().IsAssignableFrom(type))
4354
{
44-
IBsonSerializationDomain domain;
45-
46-
if (serializerRegistry is IBsonSerializerRegistryInternal serializerRegistryInternal)
47-
{
48-
domain = serializerRegistryInternal.SerializationDomain;
49-
}
50-
else
51-
{
52-
domain = BsonSerializer.DefaultSerializationDomain;
53-
}
54-
55-
var classMap = domain.BsonClassMap.LookupClassMap(type);
55+
var classMap = SerializationDomain.BsonClassMap.LookupClassMap(type);
5656
var classMapSerializerDefinition = typeof(BsonClassMapSerializer<>);
5757
var classMapSerializerType = classMapSerializerDefinition.MakeGenericType(type);
5858
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
@@ -852,7 +852,7 @@ private void CreateSerializerRegistry()
852852
_typeMappingSerializationProvider = new TypeMappingSerializationProvider();
853853

854854
// order matters. It's in reverse order of how they'll get consumed
855-
_serializerRegistry.RegisterSerializationProvider(new BsonClassMapSerializationProvider());
855+
_serializerRegistry.RegisterSerializationProvider(new BsonClassMapSerializationProvider(this));
856856
_serializerRegistry.RegisterSerializationProvider(new DiscriminatedInterfaceSerializationProvider());
857857
_serializerRegistry.RegisterSerializationProvider(new CollectionsSerializationProvider());
858858
_serializerRegistry.RegisterSerializationProvider(new PrimitiveSerializationProvider());

src/MongoDB.Bson/Serialization/BsonSerializerRegistry.cs

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,12 @@ namespace MongoDB.Bson.Serialization
2222
/// <summary>
2323
/// Default, global implementation of an <see cref="IBsonSerializerRegistry"/>.
2424
/// </summary>
25-
public sealed class BsonSerializerRegistry : IBsonSerializerRegistryInternal
25+
public sealed class BsonSerializerRegistry : IBsonSerializerRegistry
2626
{
2727
// private fields
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; //FP Need to investigate if we can remove this from here.
3231

3332
// constructors
3433
/// <summary>
@@ -48,15 +47,8 @@ internal BsonSerializerRegistry(IBsonSerializationDomain serializationDomain)
4847
_cache = new ConcurrentDictionary<Type, IBsonSerializer>();
4948
_serializationProviders = new ConcurrentStack<IBsonSerializationProvider>();
5049
_createSerializer = CreateSerializer;
51-
_serializationDomain = serializationDomain;
5250
}
5351

54-
// public methods
55-
/// <summary>
56-
/// //TODO
57-
/// </summary>
58-
IBsonSerializationDomain IBsonSerializerRegistryInternal.SerializationDomain => _serializationDomain;
59-
6052
/// <summary>
6153
/// Gets the serializer for the specified <paramref name="type" />.
6254
/// If none is already registered, the serialization providers will be used to create a serializer and it will be automatically registered.
@@ -172,17 +164,14 @@ private IBsonSerializer CreateSerializer(Type type)
172164
{
173165
foreach (var serializationProvider in _serializationProviders)
174166
{
175-
IBsonSerializer serializer;
176-
177-
var registryAwareSerializationProvider = serializationProvider as IRegistryAwareBsonSerializationProvider;
178-
if (registryAwareSerializationProvider != null)
179-
{
180-
serializer = registryAwareSerializationProvider.GetSerializer(type, this);
181-
}
182-
else
167+
var serializer = serializationProvider switch
183168
{
184-
serializer = serializationProvider.GetSerializer(type);
185-
}
169+
IDomainAwareBsonSerializationProvider domainAwareBsonSerializationProvider =>
170+
domainAwareBsonSerializationProvider.GetSerializerWithDomain(type),
171+
IRegistryAwareBsonSerializationProvider registryAwareSerializationProvider =>
172+
registryAwareSerializationProvider.GetSerializer(type, this),
173+
_ => serializationProvider.GetSerializer(type)
174+
};
186175

187176
if (serializer != null)
188177
{

src/MongoDB.Bson/Serialization/IBsonSerializationProvider.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,13 @@ public interface IRegistryAwareBsonSerializationProvider : IBsonSerializationPro
4949
/// </returns>
5050
IBsonSerializer GetSerializer(Type type, IBsonSerializerRegistry serializerRegistry);
5151
}
52+
53+
//DOMAIN-API We should use this interface the default one, and remove the previous two.
54+
internal interface IDomainAwareBsonSerializationProvider : IRegistryAwareBsonSerializationProvider
55+
{
56+
IBsonSerializationDomain SerializationDomain { get; }
57+
58+
//FP Can't use just GetSerializer because it's already used by the base interface.
59+
IBsonSerializer GetSerializerWithDomain(Type type);
60+
}
5261
}

src/MongoDB.Bson/Serialization/IBsonSerializerRegistry.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,4 @@ public interface IBsonSerializerRegistry
3636
/// <returns>The serializer.</returns>
3737
IBsonSerializer<T> GetSerializer<T>();
3838
}
39-
40-
internal interface IBsonSerializerRegistryInternal : IBsonSerializerRegistry
41-
{
42-
IBsonSerializationDomain SerializationDomain { get; }
43-
}
4439
}

0 commit comments

Comments
 (0)