Skip to content

Commit 530328e

Browse files
committed
Fix for getDicriminatorConvention and IBsonIdProvider
1 parent a6674b3 commit 530328e

18 files changed

+57
-43
lines changed

src/MongoDB.Bson/InternalExtensions.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,20 @@ namespace MongoDB.Bson
2323
//FP This could be moved somewhere else, and maybe reordered.
2424
internal static class InternalExtensions
2525
{
26+
#region IBsonIdProvider
27+
28+
public static bool GetDocumentIdInternal(this IBsonIdProvider provider, object document, IBsonSerializationDomain serializationDomain, out object id,
29+
out Type idNominalType, out IIdGenerator idGenerator)
30+
{
31+
if (provider is IBsonIdProviderInternal internalProvider)
32+
{
33+
return internalProvider.GetDocumentId(document, serializationDomain, out id, out idNominalType, out idGenerator);
34+
}
35+
return provider.GetDocumentId(document, out id, out idNominalType, out idGenerator);
36+
}
37+
38+
#endregion
39+
2640
#region IDiscriminatorConvention
2741

2842
public static Type GetActualTypeInternal(this IDiscriminatorConvention discriminatorConvention, IBsonReader bsonReader, Type nominalType, IBsonSerializationDomain serializationDomain)

src/MongoDB.Bson/Serialization/BsonSerializationProviderBase.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,17 @@ namespace MongoDB.Bson.Serialization
2323
/// </summary>
2424
public abstract class BsonSerializationProviderBase : IRegistryAwareBsonSerializationProvider
2525
{
26+
//DOMAIN-API We should remove this and use the overload that takes a serializer registry instead.
2627
/// <inheritdoc/>
2728
public virtual IBsonSerializer GetSerializer(Type type)
2829
{
29-
return GetSerializer(type, BsonSerializer.DefaultSerializationDomain.SerializerRegistry); //TODO We can keep this as is? I think in the long run we should remove this overload.
30+
return GetSerializer(type, BsonSerializer.DefaultSerializationDomain.SerializerRegistry);
3031
}
3132

3233
/// <inheritdoc/>
3334
public abstract IBsonSerializer GetSerializer(Type type, IBsonSerializerRegistry serializerRegistry);
3435

36+
//DOMAIN-API We should remove this and use the overload that takes a serializer registry instead.
3537
/// <summary>
3638
/// Creates the serializer from a serializer type definition and type arguments.
3739
/// </summary>
@@ -40,7 +42,7 @@ public virtual IBsonSerializer GetSerializer(Type type)
4042
/// <returns>A serializer.</returns>
4143
protected virtual IBsonSerializer CreateGenericSerializer(Type serializerTypeDefinition, params Type[] typeArguments)
4244
{
43-
return CreateGenericSerializer(serializerTypeDefinition, typeArguments, BsonSerializer.DefaultSerializationDomain.SerializerRegistry); //TODO We can keep this as is? I think in the long run we should remove this overload.
45+
return CreateGenericSerializer(serializerTypeDefinition, typeArguments, BsonSerializer.DefaultSerializationDomain.SerializerRegistry);
4446
}
4547

4648
/// <summary>
@@ -58,14 +60,15 @@ protected virtual IBsonSerializer CreateGenericSerializer(Type serializerTypeDef
5860
return CreateSerializer(serializerType, serializerRegistry);
5961
}
6062

63+
//DOMAIN-API We should remove this and use the overload that takes a serializer registry instead.
6164
/// <summary>
6265
/// Creates the serializer.
6366
/// </summary>
6467
/// <param name="serializerType">The serializer type.</param>
6568
/// <returns>A serializer.</returns>
6669
protected virtual IBsonSerializer CreateSerializer(Type serializerType)
6770
{
68-
return CreateSerializer(serializerType, BsonSerializer.SerializerRegistry); //TODO We can keep this as is? I think in the long run we should remove this overload.
71+
return CreateSerializer(serializerType, BsonSerializer.SerializerRegistry);
6972
}
7073

7174
/// <summary>

src/MongoDB.Bson/Serialization/IBsonIdProvider.cs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,6 @@ public interface IBsonIdProvider
4242

4343
internal interface IBsonIdProviderInternal : IBsonIdProvider
4444
{
45-
/// <summary>
46-
/// //TODO
47-
/// </summary>
48-
/// <param name="document"></param>
49-
/// <param name="serializationDomain"></param>
50-
/// <param name="id"></param>
51-
/// <param name="idNominalType"></param>
52-
/// <param name="idGenerator"></param>
53-
/// <returns></returns>
5445
bool GetDocumentId(object document, IBsonSerializationDomain serializationDomain, out object id, out Type idNominalType, out IIdGenerator idGenerator);
5546
}
5647
}

src/MongoDB.Bson/Serialization/IBsonSerializationProvider.cs

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

1818
namespace MongoDB.Bson.Serialization
1919
{
20+
//DOMAIN-API We should remove this interface and merge it with IRegistryAwareBsonSerializationProvider.
2021
/// <summary>
2122
/// An interface implemented by serialization providers.
2223
/// </summary>

src/MongoDB.Bson/Serialization/Serializers/DiscriminatedInterfaceSerializer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,12 @@ public DiscriminatedInterfaceSerializer(IDiscriminatorConvention discriminatorCo
109109
}
110110

111111
_interfaceType = typeof(TInterface);
112-
_discriminatorConvention = discriminatorConvention ?? interfaceSerializer.GetDiscriminatorConvention();
112+
_discriminatorConvention = discriminatorConvention ?? interfaceSerializer.GetDiscriminatorConvention(); //QUESTION What do we do here? We don't have the domain close by, should we lazy initialize it during serialization/deserialization?
113113
_interfaceSerializer = interfaceSerializer;
114114

115115
if (objectSerializer == null)
116116
{
117-
objectSerializer = BsonSerializer.LookupSerializer<object>(); //TODO What do we do here?
117+
objectSerializer = BsonSerializer.LookupSerializer<object>(); //QUESTION What do we do here? We don't have the domain close by, should we lazy initialize it during serialization/deserialization?
118118
if (objectSerializer is ObjectSerializer standardObjectSerializer)
119119
{
120120
Func<Type, bool> allowedTypes = (Type type) => typeof(TInterface).IsAssignableFrom(type);

src/MongoDB.Driver/BsonSerializerExtensions.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,21 @@
1313
* limitations under the License.
1414
*/
1515

16+
using MongoDB.Bson;
1617
using MongoDB.Bson.Serialization;
1718

1819
namespace MongoDB.Driver
1920
{
2021
internal static class BsonSerializerExtensions
2122
{
22-
public static object SetDocumentIdIfMissing<TDocument>(this IBsonSerializer<TDocument> serializer, object container, TDocument document)
23+
public static object SetDocumentIdIfMissing<TDocument>(this IBsonSerializer<TDocument> serializer, object container, TDocument document, IBsonSerializationDomain serializationDomain)
2324
{
2425
var idProvider = serializer as IBsonIdProvider;
2526
if (idProvider != null)
2627
{
2728
object id;
2829
IIdGenerator idGenerator;
29-
if (idProvider.GetDocumentId(document, out id, out _, out idGenerator))
30+
if (idProvider.GetDocumentIdInternal(document, serializationDomain, out id, out _, out idGenerator))
3031
{
3132
if (idGenerator != null && idGenerator.IsEmpty(id))
3233
{

src/MongoDB.Driver/Core/WireProtocol/Messages/Encoders/BinaryEncoders/ClientBulkWriteOpsSectionFormatter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ public void RenderInsertOne<TDocument>(RenderArgs<BsonDocument> renderArgs, Bson
149149
{
150150
WriteStartModel(serializationContext, "insert", model);
151151
var documentSerializer = _serializerRegistry.GetSerializer<TDocument>();
152-
var documentId = documentSerializer.SetDocumentIdIfMissing(null, model.Document);
152+
var documentId = documentSerializer.SetDocumentIdIfMissing(null, model.Document, serializationContext.SerializationDomain);
153153
_idsMap[_currentIndex] = BsonValue.Create(documentId);
154154
serializationContext.Writer.WriteName("document");
155155
documentSerializer.Serialize(serializationContext, model.Document);

src/MongoDB.Driver/FilterDefinitionBuilder.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2205,7 +2205,7 @@ public override BsonDocument Render(RenderArgs<TDocument> args)
22052205
}
22062206
else
22072207
{
2208-
var discriminatorConvention = args.DocumentSerializer.GetDiscriminatorConvention();
2208+
var discriminatorConvention = args.DocumentSerializer.GetDiscriminatorConvention(args.SerializationDomain);
22092209
if (discriminatorConvention == null)
22102210
{
22112211
var message = string.Format("OfType requires a discriminator convention for type: {0}.", BsonUtils.GetFriendlyTypeName(typeof(TDocument)));
@@ -2268,7 +2268,7 @@ public override BsonDocument Render(RenderArgs<TDocument> args)
22682268
}
22692269
else
22702270
{
2271-
var discriminatorConvention = renderedField.FieldSerializer.GetDiscriminatorConvention();
2271+
var discriminatorConvention = renderedField.FieldSerializer.GetDiscriminatorConvention(args.SerializationDomain);
22722272
if (discriminatorConvention == null)
22732273
{
22742274
var message = string.Format("OfType requires a discriminator convention for type: {0}.", BsonUtils.GetFriendlyTypeName(typeof(TField)));

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToAggregationExpressionTranslators/GetTypeComparisonExpressionToAggregationExpressionTranslator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public static TranslatedExpression Translate(TranslationContext context, BinaryE
4040
var nominalType = objectExpression.Type;
4141
var actualType = comparandType;
4242

43-
var discriminatorConvention = objectTranslation.Serializer.GetDiscriminatorConvention();
43+
var discriminatorConvention = objectTranslation.Serializer.GetDiscriminatorConvention(context.SerializationDomain);
4444
var discriminatorField = AstExpression.GetField(objectTranslation.Ast, discriminatorConvention.ElementName);
4545
var ast = DiscriminatorAstExpression.TypeEquals(discriminatorField, discriminatorConvention, nominalType, actualType, context.SerializationDomain);
4646

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToAggregationExpressionTranslators/MethodTranslators/OfTypeMethodToAggregationExpressionTranslator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public static TranslatedExpression Translate(TranslationContext context, MethodC
6565
}
6666
else
6767
{
68-
var discriminatorConvention = nominalTypeSerializer.GetDiscriminatorConvention();
68+
var discriminatorConvention = nominalTypeSerializer.GetDiscriminatorConvention(context.SerializationDomain);
6969
var itemVar = AstExpression.Var("item");
7070
var discriminatorField = AstExpression.GetField(itemVar, discriminatorConvention.ElementName);
7171

0 commit comments

Comments
 (0)