Skip to content

Commit 70f351b

Browse files
committed
More improvements
1 parent d7756c6 commit 70f351b

10 files changed

+190
-32
lines changed

src/MongoDB.Bson/BsonExtensionMethods.cs

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,31 @@ public static byte[] ToBson(
6969
IBsonSerializer serializer = null,
7070
Action<BsonSerializationContext.Builder> configurator = null,
7171
BsonSerializationArgs args = default(BsonSerializationArgs),
72+
int estimatedBsonSize = 0) => ToBson(obj, nominalType, BsonSerializer.DefaultDomain, writerSettings,
73+
serializer, configurator, args, estimatedBsonSize);
74+
75+
/// <summary>
76+
/// //TODO
77+
/// </summary>
78+
/// <param name="obj"></param>
79+
/// <param name="nominalType"></param>
80+
/// <param name="domain"></param>
81+
/// <param name="writerSettings"></param>
82+
/// <param name="serializer"></param>
83+
/// <param name="configurator"></param>
84+
/// <param name="args"></param>
85+
/// <param name="estimatedBsonSize"></param>
86+
/// <returns></returns>
87+
/// <exception cref="ArgumentException"></exception>
88+
/// <exception cref="ArgumentNullException"></exception>
89+
public static byte[] ToBson(
90+
this object obj,
91+
Type nominalType,
92+
IBsonSerializationDomain domain,
93+
BsonBinaryWriterSettings writerSettings = null,
94+
IBsonSerializer serializer = null,
95+
Action<BsonSerializationContext.Builder> configurator = null,
96+
BsonSerializationArgs args = default(BsonSerializationArgs),
7297
int estimatedBsonSize = 0)
7398
{
7499
if (estimatedBsonSize < 0)
@@ -84,7 +109,7 @@ public static byte[] ToBson(
84109

85110
if (serializer == null)
86111
{
87-
serializer = BsonSerializer.LookupSerializer(nominalType); //TODO ??
112+
serializer = domain.LookupSerializer(nominalType);
88113
}
89114
if (serializer.ValueType != nominalType)
90115
{
@@ -138,6 +163,27 @@ public static BsonDocument ToBsonDocument(
138163
Type nominalType,
139164
IBsonSerializer serializer = null,
140165
Action<BsonSerializationContext.Builder> configurator = null,
166+
BsonSerializationArgs args = default(BsonSerializationArgs)) => ToBsonDocument(obj, nominalType,
167+
BsonSerializer.DefaultDomain, serializer, configurator, args);
168+
169+
/// <summary>
170+
/// //TODO
171+
/// </summary>
172+
/// <param name="obj"></param>
173+
/// <param name="nominalType"></param>
174+
/// <param name="domain"></param>
175+
/// <param name="serializer"></param>
176+
/// <param name="configurator"></param>
177+
/// <param name="args"></param>
178+
/// <returns></returns>
179+
/// <exception cref="ArgumentNullException"></exception>
180+
/// <exception cref="ArgumentException"></exception>
181+
public static BsonDocument ToBsonDocument(
182+
this object obj,
183+
Type nominalType,
184+
IBsonSerializationDomain domain,
185+
IBsonSerializer serializer = null,
186+
Action<BsonSerializationContext.Builder> configurator = null,
141187
BsonSerializationArgs args = default(BsonSerializationArgs))
142188
{
143189
if (nominalType == null)
@@ -165,7 +211,7 @@ public static BsonDocument ToBsonDocument(
165211
return convertibleToBsonDocument.ToBsonDocument(); // use the provided ToBsonDocument method
166212
}
167213

168-
serializer = BsonSerializer.LookupSerializer(nominalType); //TODO ??
214+
serializer = domain.LookupSerializer(nominalType); //TODO ??
169215
}
170216
if (serializer.ValueType != nominalType)
171217
{
@@ -227,6 +273,29 @@ public static string ToJson(
227273
IBsonSerializer serializer = null,
228274
Action<BsonSerializationContext.Builder> configurator = null,
229275
BsonSerializationArgs args = default(BsonSerializationArgs))
276+
=> ToJson(obj, nominalType, BsonSerializer.DefaultDomain, writerSettings, serializer, configurator, args);
277+
278+
/// <summary>
279+
/// //TODO
280+
/// </summary>
281+
/// <param name="obj"></param>
282+
/// <param name="nominalType"></param>
283+
/// <param name="domain"></param>
284+
/// <param name="writerSettings"></param>
285+
/// <param name="serializer"></param>
286+
/// <param name="configurator"></param>
287+
/// <param name="args"></param>
288+
/// <returns></returns>
289+
/// <exception cref="ArgumentNullException"></exception>
290+
/// <exception cref="ArgumentException"></exception>
291+
public static string ToJson(
292+
this object obj,
293+
Type nominalType,
294+
IBsonSerializationDomain domain,
295+
JsonWriterSettings writerSettings = null,
296+
IBsonSerializer serializer = null,
297+
Action<BsonSerializationContext.Builder> configurator = null,
298+
BsonSerializationArgs args = default(BsonSerializationArgs))
230299
{
231300
if (nominalType == null)
232301
{
@@ -236,7 +305,7 @@ public static string ToJson(
236305

237306
if (serializer == null)
238307
{
239-
serializer = BsonSerializer.LookupSerializer(nominalType); //TODO ??
308+
serializer = domain.LookupSerializer(nominalType);
240309
}
241310
if (serializer.ValueType != nominalType)
242311
{

src/MongoDB.Bson/ObjectModel/BsonDocumentWrapper.cs

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,19 @@ public object Wrapped
9191
/// <typeparam name="TNominalType">The nominal type of the wrapped object.</typeparam>
9292
/// <param name="value">The wrapped object.</param>
9393
/// <returns>A BsonDocumentWrapper.</returns>
94-
public static BsonDocumentWrapper Create<TNominalType>(TNominalType value)
94+
public static BsonDocumentWrapper Create<TNominalType>(TNominalType value) =>
95+
Create(value, BsonSerializer.DefaultDomain);
96+
97+
/// <summary>
98+
/// //TODO
99+
/// </summary>
100+
/// <param name="value"></param>
101+
/// <param name="domain"></param>
102+
/// <typeparam name="TNominalType"></typeparam>
103+
/// <returns></returns>
104+
public static BsonDocumentWrapper Create<TNominalType>(TNominalType value, IBsonSerializationDomain domain)
95105
{
96-
return Create(typeof(TNominalType), value);
106+
return Create(typeof(TNominalType), value, domain);
97107
}
98108

99109
/// <summary>
@@ -102,9 +112,19 @@ public static BsonDocumentWrapper Create<TNominalType>(TNominalType value)
102112
/// <param name="nominalType">The nominal type of the wrapped object.</param>
103113
/// <param name="value">The wrapped object.</param>
104114
/// <returns>A BsonDocumentWrapper.</returns>
105-
public static BsonDocumentWrapper Create(Type nominalType, object value)
115+
public static BsonDocumentWrapper Create(Type nominalType, object value) =>
116+
Create(nominalType, value, BsonSerializer.DefaultDomain);
117+
118+
/// <summary>
119+
/// //TODO
120+
/// </summary>
121+
/// <param name="nominalType"></param>
122+
/// <param name="value"></param>
123+
/// <param name="domain"></param>
124+
/// <returns></returns>
125+
public static BsonDocumentWrapper Create(Type nominalType, object value, IBsonSerializationDomain domain)
106126
{
107-
var serializer = BsonSerializer.LookupSerializer(nominalType); //TODO ??
127+
var serializer = domain.LookupSerializer(nominalType); //TODO ??
108128
return new BsonDocumentWrapper(value, serializer);
109129
}
110130

@@ -114,14 +134,25 @@ public static BsonDocumentWrapper Create(Type nominalType, object value)
114134
/// <typeparam name="TNominalType">The nominal type of the wrapped objects.</typeparam>
115135
/// <param name="values">A list of wrapped objects.</param>
116136
/// <returns>A list of BsonDocumentWrappers.</returns>
117-
public static IEnumerable<BsonDocumentWrapper> CreateMultiple<TNominalType>(IEnumerable<TNominalType> values)
137+
public static IEnumerable<BsonDocumentWrapper> CreateMultiple<TNominalType>(IEnumerable<TNominalType> values) =>
138+
CreateMultiple(values, BsonSerializer.DefaultDomain);
139+
140+
/// <summary>
141+
/// //TODO
142+
/// </summary>
143+
/// <param name="values"></param>
144+
/// <param name="domain"></param>
145+
/// <typeparam name="TNominalType"></typeparam>
146+
/// <returns></returns>
147+
/// <exception cref="ArgumentNullException"></exception>
148+
public static IEnumerable<BsonDocumentWrapper> CreateMultiple<TNominalType>(IEnumerable<TNominalType> values, IBsonSerializationDomain domain)
118149
{
119150
if (values == null)
120151
{
121152
throw new ArgumentNullException("values");
122153
}
123154

124-
var serializer = BsonSerializer.LookupSerializer(typeof(TNominalType)); //TODO ??
155+
var serializer = domain.LookupSerializer(typeof(TNominalType));
125156
return values.Select(v => new BsonDocumentWrapper(v, serializer));
126157
}
127158

@@ -131,7 +162,18 @@ public static IEnumerable<BsonDocumentWrapper> CreateMultiple<TNominalType>(IEnu
131162
/// <param name="nominalType">The nominal type of the wrapped object.</param>
132163
/// <param name="values">A list of wrapped objects.</param>
133164
/// <returns>A list of BsonDocumentWrappers.</returns>
134-
public static IEnumerable<BsonDocumentWrapper> CreateMultiple(Type nominalType, IEnumerable values)
165+
public static IEnumerable<BsonDocumentWrapper> CreateMultiple(Type nominalType, IEnumerable values) =>
166+
CreateMultiple(nominalType, values, BsonSerializer.DefaultDomain);
167+
168+
/// <summary>
169+
/// //TODO
170+
/// </summary>
171+
/// <param name="nominalType"></param>
172+
/// <param name="values"></param>
173+
/// <param name="domain"></param>
174+
/// <returns></returns>
175+
/// <exception cref="ArgumentNullException"></exception>
176+
public static IEnumerable<BsonDocumentWrapper> CreateMultiple(Type nominalType, IEnumerable values, IBsonSerializationDomain domain)
135177
{
136178
if (nominalType == null)
137179
{
@@ -142,10 +184,12 @@ public static IEnumerable<BsonDocumentWrapper> CreateMultiple(Type nominalType,
142184
throw new ArgumentNullException("values");
143185
}
144186

145-
var serializer = BsonSerializer.LookupSerializer(nominalType); //TODO ??
187+
var serializer = domain.LookupSerializer(nominalType);
146188
return values.Cast<object>().Select(v => new BsonDocumentWrapper(v, serializer));
147189
}
148190

191+
192+
149193
// public methods
150194
/// <summary>
151195
/// Creates a shallow clone of the document (see also DeepClone).

src/MongoDB.Bson/Serialization/BsonMemberMap.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -294,14 +294,21 @@ obj is BsonMemberMap other &&
294294
/// Gets the serializer.
295295
/// </summary>
296296
/// <returns>The serializer.</returns>
297-
public IBsonSerializer GetSerializer()
297+
public IBsonSerializer GetSerializer() => GetSerializer(BsonSerializer.DefaultDomain);
298+
299+
/// <summary>
300+
/// //TODO
301+
/// </summary>
302+
/// <param name="domain"></param>
303+
/// <returns></returns>
304+
public IBsonSerializer GetSerializer(IBsonSerializationDomain domain)
298305
{
299306
if (_serializer == null)
300307
{
301308
// return special serializer for BsonValue members that handles the _csharpnull representation
302309
if (_memberTypeIsBsonValue)
303310
{
304-
var wrappedSerializer = BsonSerializer.LookupSerializer(_memberType); //TODO ??
311+
var wrappedSerializer = domain.LookupSerializer(_memberType);
305312
var isBsonArraySerializer = wrappedSerializer is IBsonArraySerializer;
306313
var isBsonDocumentSerializer = wrappedSerializer is IBsonDocumentSerializer;
307314

src/MongoDB.Bson/Serialization/BsonSerializationProviderBase.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ namespace MongoDB.Bson.Serialization
2424
public abstract class BsonSerializationProviderBase : IRegistryAwareBsonSerializationProvider
2525
{
2626
/// <inheritdoc/>
27-
public virtual IBsonSerializer GetSerializer(Type type) //TODO We can keep this as is
27+
public virtual IBsonSerializer GetSerializer(Type type)
2828
{
29-
return GetSerializer(type, BsonSerializer.SerializerRegistry);
29+
return GetSerializer(type, BsonSerializer.SerializerRegistry); //TODO We can keep this as is
3030
}
3131

3232
/// <inheritdoc/>
@@ -38,9 +38,9 @@ public virtual IBsonSerializer GetSerializer(Type type) //TODO We can keep this
3838
/// <param name="serializerTypeDefinition">The serializer type definition.</param>
3939
/// <param name="typeArguments">The type arguments.</param>
4040
/// <returns>A serializer.</returns>
41-
protected virtual IBsonSerializer CreateGenericSerializer(Type serializerTypeDefinition, params Type[] typeArguments) //TODO We can keep this as is
41+
protected virtual IBsonSerializer CreateGenericSerializer(Type serializerTypeDefinition, params Type[] typeArguments)
4242
{
43-
return CreateGenericSerializer(serializerTypeDefinition, typeArguments, BsonSerializer.SerializerRegistry);
43+
return CreateGenericSerializer(serializerTypeDefinition, typeArguments, BsonSerializer.SerializerRegistry); //TODO We can keep this as is
4444
}
4545

4646
/// <summary>

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,11 @@ obj is ObjectDiscriminatorConvention other &&
8686
/// <param name="bsonReader">The reader.</param>
8787
/// <param name="nominalType">The nominal type.</param>
8888
/// <returns>The actual type.</returns>
89-
public Type GetActualType(IBsonReader bsonReader, Type nominalType)
89+
public Type GetActualType(IBsonReader bsonReader, Type nominalType) =>
90+
GetActualType(bsonReader, nominalType, BsonSerializer.DefaultDomain);
91+
92+
/// <inheritdoc />
93+
public Type GetActualType(IBsonReader bsonReader, Type nominalType, IBsonSerializationDomain domain)
9094
{
9195
// the BsonReader is sitting at the value whose actual type needs to be found
9296
var bsonType = bsonReader.GetCurrentBsonType();
@@ -135,7 +139,7 @@ public Type GetActualType(IBsonReader bsonReader, Type nominalType)
135139
{
136140
discriminator = discriminator.AsBsonArray.Last(); // last item is leaf class discriminator
137141
}
138-
actualType = BsonSerializer.LookupActualType(nominalType, discriminator); //TODO ??
142+
actualType = domain.LookupActualType(nominalType, discriminator);
139143
}
140144
bsonReader.ReturnToBookmark(bookmark);
141145
return actualType;
@@ -144,12 +148,6 @@ public Type GetActualType(IBsonReader bsonReader, Type nominalType)
144148
return nominalType;
145149
}
146150

147-
/// <inheritdoc />
148-
public Type GetActualType(IBsonReader bsonReader, Type nominalType, IBsonSerializationDomain domain)
149-
{
150-
throw new NotImplementedException();
151-
}
152-
153151
/// <summary>
154152
/// Gets the discriminator value for an actual type.
155153
/// </summary>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ public Type GetActualType(IBsonReader bsonReader, Type nominalType, IBsonSeriali
121121
{
122122
discriminator = discriminator.AsBsonArray.Last(); // last item is leaf class discriminator
123123
}
124-
actualType = BsonSerializer.LookupActualType(nominalType, discriminator); //TODO ??
124+
actualType = domain.LookupActualType(nominalType, discriminator);
125125
}
126126
bsonReader.ReturnToBookmark(bookmark);
127127
return actualType;

src/MongoDB.Bson/Serialization/IBsonIdProvider.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,17 @@ public interface IBsonIdProvider
3232
/// <returns>True if the document has an Id.</returns>
3333
bool GetDocumentId(object document, out object id, out Type idNominalType, out IIdGenerator idGenerator);
3434

35+
/// <summary>
36+
/// //TODO
37+
/// </summary>
38+
/// <param name="document"></param>
39+
/// <param name="domain"></param>
40+
/// <param name="id"></param>
41+
/// <param name="idNominalType"></param>
42+
/// <param name="idGenerator"></param>
43+
/// <returns></returns>
44+
bool GetDocumentId(object document, IBsonSerializationDomain domain, out object id, out Type idNominalType, out IIdGenerator idGenerator);
45+
3546
/// <summary>
3647
/// Sets the document Id.
3748
/// </summary>

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ public bool GetDocumentId(
8181
object document,
8282
out object id,
8383
out Type idNominalType,
84+
out IIdGenerator idGenerator) => GetDocumentId(document, BsonSerializer.DefaultDomain, out id,
85+
out idNominalType, out idGenerator);
86+
87+
/// <inheritdoc />
88+
public bool GetDocumentId(object document, IBsonSerializationDomain domain, out object id, out Type idNominalType,
8489
out IIdGenerator idGenerator)
8590
{
8691
var bsonDocument = (BsonDocument)document;
@@ -89,7 +94,7 @@ public bool GetDocumentId(
8994
if (bsonDocument.TryGetValue("_id", out idBsonValue))
9095
{
9196
id = idBsonValue;
92-
idGenerator = BsonSerializer.LookupIdGenerator(id.GetType()); //TODO ??
97+
idGenerator = domain.LookupIdGenerator(id.GetType());
9398

9499
if (idGenerator == null)
95100
{

0 commit comments

Comments
 (0)