Skip to content

Commit 2157ae8

Browse files
committed
Some improvements
1 parent 8b15445 commit 2157ae8

File tree

6 files changed

+39
-27
lines changed

6 files changed

+39
-27
lines changed

src/MongoDB.Bson/Serialization/BsonClassMap.cs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ public class BsonClassMap
3434
// private fields
3535
private readonly Type _classType;
3636
private readonly List<BsonCreatorMap> _creatorMaps;
37-
private readonly IConventionPack _conventionPack;
3837
private readonly bool _isAnonymous;
3938
private readonly List<BsonMemberMap> _allMemberMaps; // includes inherited member maps
4039
private readonly ReadOnlyCollection<BsonMemberMap> _allMemberMapsReadonly;
@@ -65,7 +64,6 @@ public BsonClassMap(Type classType)
6564
{
6665
_classType = classType;
6766
_creatorMaps = new List<BsonCreatorMap>();
68-
_conventionPack = ConventionRegistry.Lookup(classType);
6967
_isAnonymous = classType.IsAnonymousType();
7068
_allMemberMaps = new List<BsonMemberMap>();
7169
_allMemberMapsReadonly = _allMemberMaps.AsReadOnly();
@@ -119,14 +117,6 @@ public IEnumerable<BsonCreatorMap> CreatorMaps
119117
get { return _creatorMaps; }
120118
}
121119

122-
/// <summary>
123-
/// Gets the conventions used for auto mapping.
124-
/// </summary>
125-
public IConventionPack ConventionPack
126-
{
127-
get { return _conventionPack; }
128-
}
129-
130120
/// <summary>
131121
/// Gets the declared member maps (only for members declared in this class).
132122
/// </summary>
@@ -359,10 +349,16 @@ public static bool TryRegisterClassMap<TClass>(Func<BsonClassMap<TClass>> classM
359349
/// <summary>
360350
/// Automaps the class.
361351
/// </summary>
362-
public void AutoMap()
352+
public void AutoMap() => AutoMap(BsonSerializer.DefaultSerializationDomain);
353+
354+
/// <summary>
355+
/// //TODO
356+
/// </summary>
357+
/// <param name="serializationDomain"></param>
358+
public void AutoMap(IBsonSerializationDomain serializationDomain)
363359
{
364360
if (_frozen) { ThrowFrozenException(); }
365-
AutoMapClass();
361+
AutoMapClass(serializationDomain);
366362
}
367363

368364
/// <summary>
@@ -1208,9 +1204,10 @@ IDiscriminatorConvention LookupDiscriminatorConvention()
12081204
}
12091205

12101206
// private methods
1211-
private void AutoMapClass()
1207+
private void AutoMapClass(IBsonSerializationDomain serializationDomain)
12121208
{
1213-
new ConventionRunner(_conventionPack).Apply(this);
1209+
var conventionPack = serializationDomain.ConventionRegistry.Lookup(_classType);
1210+
new ConventionRunner(conventionPack).Apply(this);
12141211

12151212
foreach (var memberMap in _declaredMemberMaps)
12161213
{

src/MongoDB.Bson/Serialization/BsonClassMapDomain.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,14 @@ namespace MongoDB.Bson.Serialization;
88
internal class BsonClassMapDomain : IBsonClassMapDomain
99
{
1010
// private fields
11+
private readonly IBsonSerializationDomain _serializationDomain;
1112
private readonly Dictionary<Type, BsonClassMap> _classMaps = new();
1213

14+
public BsonClassMapDomain(BsonSerializationDomain serializationDomain)
15+
{
16+
_serializationDomain = serializationDomain;
17+
}
18+
1319
/// <summary>
1420
/// Gets all registered class maps.
1521
/// </summary>
@@ -83,7 +89,7 @@ public BsonClassMap LookupClassMap(Type classType)
8389
var classMapDefinition = typeof(BsonClassMap<>);
8490
var classMapType = classMapDefinition.MakeGenericType(classType);
8591
var newClassMap = (BsonClassMap)Activator.CreateInstance(classMapType);
86-
newClassMap.AutoMap();
92+
newClassMap.AutoMap(_serializationDomain);
8793

8894
BsonSerializer.ConfigLock.EnterWriteLock();
8995
try
@@ -109,7 +115,7 @@ public BsonClassMap LookupClassMap(Type classType)
109115
/// <returns>The class map.</returns>
110116
public BsonClassMap<TClass> RegisterClassMap<TClass>()
111117
{
112-
return RegisterClassMap<TClass>(cm => { cm.AutoMap(); });
118+
return RegisterClassMap<TClass>(cm => { cm.AutoMap(_serializationDomain); });
113119
}
114120

115121
/// <summary>
@@ -156,12 +162,12 @@ public void RegisterClassMap(BsonClassMap classMap)
156162
/// <returns>True if this call registered the class map, false if the class map was already registered.</returns>
157163
public bool TryRegisterClassMap<TClass>()
158164
{
159-
return TryRegisterClassMap(ClassMapFactory);
165+
return TryRegisterClassMap(() => ClassMapFactory(_serializationDomain));
160166

161-
static BsonClassMap<TClass> ClassMapFactory()
167+
static BsonClassMap<TClass> ClassMapFactory(IBsonSerializationDomain serializationDomain)
162168
{
163169
var classMap = new BsonClassMap<TClass>();
164-
classMap.AutoMap();
170+
classMap.AutoMap(serializationDomain);
165171
return classMap;
166172
}
167173
}

src/MongoDB.Bson/Serialization/BsonSerializationDomain.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,8 @@ internal class BsonSerializationDomain : IBsonSerializationDomainInternal, IDisp
3838
public BsonSerializationDomain(string name = null) //TODO name is used for testing
3939
{
4040
CreateSerializerRegistry();
41+
CreateSubDomains();
4142
RegisterIdGenerators();
42-
_classMapDomain = new BsonClassMapDomain();
43-
_conventionRegistryDomain = new ConventionRegistryDomain();
4443
Name = name ?? "CUSTOM"; //TODO remove after testing is done
4544
}
4645

@@ -815,6 +814,12 @@ private void CreateSerializerRegistry()
815814
_serializerRegistry.RegisterSerializationProvider(new BsonObjectModelSerializationProvider());
816815
}
817816

817+
private void CreateSubDomains()
818+
{
819+
_classMapDomain = new BsonClassMapDomain(this);
820+
_conventionRegistryDomain = new ConventionRegistryDomain();
821+
}
822+
818823
private void RegisterIdGenerators()
819824
{
820825
RegisterIdGenerator(typeof(BsonObjectId), BsonObjectIdGenerator.Instance);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ private static IBsonSerializer<TInterface> CreateInterfaceSerializer(IBsonSerial
4646
var classMapDefinition = typeof(BsonClassMap<>);
4747
var classMapType = classMapDefinition.MakeGenericType(typeof(TInterface));
4848
var classMap = (BsonClassMap)Activator.CreateInstance(classMapType);
49-
classMap.AutoMap();
49+
classMap.AutoMap(domain);
5050
classMap.SetDiscriminatorConvention(domain.LookupDiscriminatorConvention(typeof(TInterface)));
5151
classMap.Freeze(domain);
5252
return new BsonClassMapSerializer<TInterface>(classMap);

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public static AggregationExpression Translate(
4747
var constructorInfo = newExpression.Constructor; // note: can be null when using the default constructor with a struct
4848
var constructorArguments = newExpression.Arguments;
4949
var computedFields = new List<AstComputedField>();
50-
var classMap = CreateClassMap(newExpression.Type, constructorInfo, out var creatorMap);
50+
var classMap = CreateClassMap(context, newExpression.Type, constructorInfo, out var creatorMap);
5151

5252
if (constructorInfo != null && creatorMap != null)
5353
{
@@ -100,12 +100,12 @@ public static AggregationExpression Translate(
100100
return new AggregationExpression(expression, ast, serializer);
101101
}
102102

103-
private static BsonClassMap CreateClassMap(Type classType, ConstructorInfo constructorInfo, out BsonCreatorMap creatorMap)
103+
private static BsonClassMap CreateClassMap(TranslationContext context, Type classType, ConstructorInfo constructorInfo, out BsonCreatorMap creatorMap)
104104
{
105105
BsonClassMap baseClassMap = null;
106106
if (classType.BaseType != null)
107107
{
108-
baseClassMap = CreateClassMap(classType.BaseType, null, out _);
108+
baseClassMap = CreateClassMap(context, classType.BaseType, null, out _);
109109
}
110110

111111
var classMapType = typeof(BsonClassMap<>).MakeGenericType(classType);
@@ -120,7 +120,7 @@ private static BsonClassMap CreateClassMap(Type classType, ConstructorInfo const
120120
creatorMap = null;
121121
}
122122

123-
classMap.AutoMap();
123+
classMap.AutoMap(context.SerializationDomain);
124124
classMap.IdMemberMap?.SetElementName("_id"); // normally happens when Freeze is called but we need it sooner here
125125

126126
return classMap;

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/TranslationContext.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,31 +32,35 @@ public static TranslationContext Create(
3232
{
3333
var symbolTable = new SymbolTable();
3434
var nameGenerator = new NameGenerator();
35-
return new TranslationContext(symbolTable, nameGenerator, translationOptions, data);
35+
return new TranslationContext(symbolTable, nameGenerator, translationOptions, BsonSerializer.DefaultSerializationDomain, data); //TODO It'll be annoying to pass the serialization domain in the call here
3636
}
3737
#endregion
3838

3939
// private fields
4040
private readonly TranslationContextData _data;
4141
private readonly NameGenerator _nameGenerator;
42+
private readonly IBsonSerializationDomain _serializationDomain;
4243
private readonly SymbolTable _symbolTable;
4344
private readonly ExpressionTranslationOptions _translationOptions;
4445

4546
private TranslationContext(
4647
SymbolTable symbolTable,
4748
NameGenerator nameGenerator,
4849
ExpressionTranslationOptions translationOptions,
50+
IBsonSerializationDomain serializationDomain,
4951
TranslationContextData data = null)
5052
{
5153
_symbolTable = Ensure.IsNotNull(symbolTable, nameof(symbolTable));
5254
_nameGenerator = Ensure.IsNotNull(nameGenerator, nameof(nameGenerator));
5355
_translationOptions = translationOptions ?? new ExpressionTranslationOptions();
56+
_serializationDomain = Ensure.IsNotNull(serializationDomain, nameof(serializationDomain));
5457
_data = data; // can be null
5558
}
5659

5760
// public properties
5861
public TranslationContextData Data => _data;
5962
public NameGenerator NameGenerator => _nameGenerator;
63+
public IBsonSerializationDomain SerializationDomain => _serializationDomain;
6064
public SymbolTable SymbolTable => _symbolTable;
6165
public ExpressionTranslationOptions TranslationOptions => _translationOptions;
6266

0 commit comments

Comments
 (0)