Skip to content

Commit 48af503

Browse files
committed
Builders example
1 parent d302702 commit 48af503

File tree

4 files changed

+362
-0
lines changed

4 files changed

+362
-0
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/* Copyright 2010-present MongoDB Inc.
2+
*
3+
* Licensed under the Apache License, Version 2.0 (the "License");
4+
* you may not use this file except in compliance with the License.
5+
* You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software
10+
* distributed under the License is distributed on an "AS IS" BASIS,
11+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
* See the License for the specific language governing permissions and
13+
* limitations under the License.
14+
*/
15+
16+
using System;
17+
using MongoDB.Bson.Serialization;
18+
using MongoDB.Bson.Serialization.Conventions;
19+
20+
namespace MongoDB.Bson.Builders;
21+
22+
/* All the builders here contain the methods from the respective domain/classes that can be used for configurations.
23+
*/
24+
25+
internal interface ISerializationDomainBuilder
26+
{
27+
ISerializationDomainBuilder RegisterDiscriminator(Type type, BsonValue discriminator);
28+
29+
ISerializationDomainBuilder RegisterDiscriminatorConvention(Type type, IDiscriminatorConvention convention);
30+
31+
ISerializationDomainBuilder RegisterGenericSerializerDefinition(
32+
Type genericTypeDefinition,
33+
Type genericSerializerDefinition);
34+
35+
ISerializationDomainBuilder RegisterIdGenerator(Type type, IIdGenerator idGenerator);
36+
37+
ISerializationDomainBuilder RegisterSerializationProvider(IBsonSerializationProvider provider);
38+
39+
ISerializationDomainBuilder RegisterSerializer<T>(IBsonSerializer<T> serializer);
40+
41+
ISerializationDomainBuilder RegisterSerializer(Type type, IBsonSerializer serializer);
42+
43+
ISerializationDomainBuilder TryRegisterSerializer(Type type, IBsonSerializer serializer);
44+
45+
ISerializationDomainBuilder TryRegisterSerializer<T>(IBsonSerializer<T> serializer);
46+
47+
ISerializationDomainBuilder UseNullIdChecker(bool useNullIdChecker);
48+
49+
ISerializationDomainBuilder UseZeroIdChecker(bool useZeroIdChecker);
50+
51+
ISerializationDomainBuilder ConfigureClassMap(Action<IBsonClassMapDomainBuilder> configure);
52+
53+
ISerializationDomainBuilder ConfigureConventionRegistry(Action<IConventionRegistryDomainBuilder> configure);
54+
55+
ISerializationDomainBuilder ConfigureBsonDefaults(Action<IBsonDefaultsBuilder> configure);
56+
57+
IBsonSerializationDomain1 Build();
58+
}
59+
60+
internal interface IBsonClassMapDomainBuilder
61+
{
62+
IBsonClassMapDomainBuilder RegisterClassMap<TClass>();
63+
64+
IBsonClassMapDomainBuilder RegisterClassMap<TClass>(Action<BsonClassMap<TClass>> classMapInitializer);
65+
66+
IBsonClassMapDomainBuilder RegisterClassMap(BsonClassMap classMap);
67+
68+
IBsonClassMapDomainBuilder TryRegisterClassMap<TClass>();
69+
70+
IBsonClassMapDomainBuilder TryRegisterClassMap<TClass>(BsonClassMap<TClass> classMap);
71+
72+
IBsonClassMapDomainBuilder TryRegisterClassMap<TClass>(Action<BsonClassMap<TClass>> classMapInitializer);
73+
74+
IBsonClassMapDomainBuilder TryRegisterClassMap<TClass>(Func<BsonClassMap<TClass>> classMapFactory);
75+
}
76+
77+
internal interface IConventionRegistryDomainBuilder
78+
{
79+
IConventionRegistryDomainBuilder Register(string name, IConventionPack conventions, Func<Type, bool> filter);
80+
}
81+
82+
internal interface IBsonDefaultsBuilder
83+
{
84+
IBsonDefaultsBuilder SetDynamicArraySerializer(IBsonSerializer serializer);
85+
IBsonDefaultsBuilder SetDynamicDocumentSerializer(IBsonSerializer serializer);
86+
IBsonDefaultsBuilder SetMaxDocumentSize(int size);
87+
IBsonDefaultsBuilder SetMaxSerializationDepth(int depth);
88+
}

src/MongoDB.Bson/Builders/Builders.cs

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/* Copyright 2010-present MongoDB Inc.
2+
*
3+
* Licensed under the Apache License, Version 2.0 (the "License");
4+
* you may not use this file except in compliance with the License.
5+
* You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software
10+
* distributed under the License is distributed on an "AS IS" BASIS,
11+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
* See the License for the specific language governing permissions and
13+
* limitations under the License.
14+
*/
15+
16+
using System;
17+
using MongoDB.Bson.Serialization;
18+
using MongoDB.Bson.Serialization.Conventions;
19+
20+
namespace MongoDB.Bson.Builders;
21+
22+
internal class SerializationDomainBuilder : ISerializationDomainBuilder
23+
{
24+
public ISerializationDomainBuilder RegisterDiscriminator(Type type, BsonValue discriminator) => this;
25+
public ISerializationDomainBuilder RegisterDiscriminatorConvention(Type type, IDiscriminatorConvention convention) => this;
26+
public ISerializationDomainBuilder RegisterGenericSerializerDefinition(Type genericTypeDefinition, Type genericSerializerDefinition) => this;
27+
public ISerializationDomainBuilder RegisterIdGenerator(Type type, IIdGenerator idGenerator) => this;
28+
public ISerializationDomainBuilder RegisterSerializationProvider(IBsonSerializationProvider provider) => this;
29+
public ISerializationDomainBuilder RegisterSerializer<T>(IBsonSerializer<T> serializer) => this;
30+
public ISerializationDomainBuilder RegisterSerializer(Type type, IBsonSerializer serializer) => this;
31+
public ISerializationDomainBuilder TryRegisterSerializer(Type type, IBsonSerializer serializer) => this;
32+
public ISerializationDomainBuilder TryRegisterSerializer<T>(IBsonSerializer<T> serializer) => this;
33+
public ISerializationDomainBuilder UseNullIdChecker(bool useNullIdChecker) => this;
34+
public ISerializationDomainBuilder UseZeroIdChecker(bool useZeroIdChecker) => this;
35+
36+
public ISerializationDomainBuilder ConfigureClassMap(Action<IBsonClassMapDomainBuilder> configure)
37+
{
38+
configure(new BsonClassMapDomainBuilder());
39+
return this;
40+
}
41+
42+
public ISerializationDomainBuilder ConfigureConventionRegistry(Action<IConventionRegistryDomainBuilder> configure)
43+
{
44+
configure(new ConventionRegistryDomainBuilder());
45+
return this;
46+
}
47+
48+
public ISerializationDomainBuilder ConfigureBsonDefaults(Action<IBsonDefaultsBuilder> configure)
49+
{
50+
configure(new BsonDefaultsBuilder());
51+
return this;
52+
}
53+
54+
public IBsonSerializationDomain1 Build() => null!;
55+
}
56+
57+
internal class BsonClassMapDomainBuilder : IBsonClassMapDomainBuilder
58+
{
59+
public IBsonClassMapDomainBuilder RegisterClassMap<TClass>() => this;
60+
public IBsonClassMapDomainBuilder RegisterClassMap<TClass>(Action<BsonClassMap<TClass>> classMapInitializer) => this;
61+
public IBsonClassMapDomainBuilder RegisterClassMap(BsonClassMap classMap) => this;
62+
public IBsonClassMapDomainBuilder TryRegisterClassMap<TClass>() => this;
63+
public IBsonClassMapDomainBuilder TryRegisterClassMap<TClass>(BsonClassMap<TClass> classMap) => this;
64+
public IBsonClassMapDomainBuilder TryRegisterClassMap<TClass>(Action<BsonClassMap<TClass>> classMapInitializer) => this;
65+
public IBsonClassMapDomainBuilder TryRegisterClassMap<TClass>(Func<BsonClassMap<TClass>> classMapFactory) => this;
66+
}
67+
68+
internal class ConventionRegistryDomainBuilder : IConventionRegistryDomainBuilder
69+
{
70+
public IConventionRegistryDomainBuilder Register(string name, IConventionPack conventions, Func<Type, bool> filter) => this;
71+
}
72+
73+
internal class BsonDefaultsBuilder : IBsonDefaultsBuilder
74+
{
75+
public IBsonDefaultsBuilder SetDynamicArraySerializer(IBsonSerializer serializer) => this;
76+
public IBsonDefaultsBuilder SetDynamicDocumentSerializer(IBsonSerializer serializer) => this;
77+
public IBsonDefaultsBuilder SetMaxDocumentSize(int size) => this;
78+
public IBsonDefaultsBuilder SetMaxSerializationDepth(int depth) => this;
79+
}
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
/* Copyright 2010-present MongoDB Inc.
2+
*
3+
* Licensed under the Apache License, Version 2.0 (the "License");
4+
* you may not use this file except in compliance with the License.
5+
* You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software
10+
* distributed under the License is distributed on an "AS IS" BASIS,
11+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
* See the License for the specific language governing permissions and
13+
* limitations under the License.
14+
*/
15+
16+
using System;
17+
using System.Collections.Generic;
18+
using System.IO;
19+
using MongoDB.Bson.IO;
20+
using MongoDB.Bson.Serialization;
21+
using MongoDB.Bson.Serialization.Conventions;
22+
23+
namespace MongoDB.Bson.Builders;
24+
25+
/* All the interfaces here contain the methods from the respective domain/classes that can be used for lookups.
26+
* These are the interfaces generated by the builders and that we can pass around.
27+
*/
28+
29+
internal interface IBsonSerializationDomain1
30+
{
31+
bool IsTypeDiscriminated(Type type);
32+
33+
Type LookupActualType(Type nominalType, BsonValue discriminator);
34+
35+
IDiscriminatorConvention LookupDiscriminatorConvention(Type type);
36+
37+
IIdGenerator LookupIdGenerator(Type type);
38+
39+
IBsonSerializer<T> LookupSerializer<T>();
40+
41+
IBsonSerializer LookupSerializer(Type type);
42+
43+
IBsonSerializerRegistry SerializerRegistry { get; }
44+
45+
TNominalType Deserialize<TNominalType>(BsonDocument document,
46+
Action<BsonDeserializationContext.Builder> configurator = null);
47+
48+
TNominalType Deserialize<TNominalType>(IBsonReader bsonReader,
49+
Action<BsonDeserializationContext.Builder> configurator = null);
50+
51+
TNominalType Deserialize<TNominalType>(byte[] bytes,
52+
Action<BsonDeserializationContext.Builder> configurator = null);
53+
54+
TNominalType Deserialize<TNominalType>(Stream stream,
55+
Action<BsonDeserializationContext.Builder> configurator = null);
56+
57+
TNominalType Deserialize<TNominalType>(string json,
58+
Action<BsonDeserializationContext.Builder> configurator = null);
59+
60+
TNominalType Deserialize<TNominalType>(TextReader textReader,
61+
Action<BsonDeserializationContext.Builder> configurator = null);
62+
63+
object Deserialize(BsonDocument document, Type nominalType,
64+
Action<BsonDeserializationContext.Builder> configurator = null);
65+
66+
object Deserialize(IBsonReader bsonReader, Type nominalType,
67+
Action<BsonDeserializationContext.Builder> configurator = null);
68+
69+
object Deserialize(byte[] bytes, Type nominalType,
70+
Action<BsonDeserializationContext.Builder> configurator = null);
71+
72+
object Deserialize(Stream stream, Type nominalType,
73+
Action<BsonDeserializationContext.Builder> configurator = null);
74+
75+
object Deserialize(string json, Type nominalType,
76+
Action<BsonDeserializationContext.Builder> configurator = null);
77+
78+
object Deserialize(TextReader textReader, Type nominalType,
79+
Action<BsonDeserializationContext.Builder> configurator = null);
80+
81+
void Serialize<TNominalType>(
82+
IBsonWriter bsonWriter,
83+
TNominalType value,
84+
Action<BsonSerializationContext.Builder> configurator = null,
85+
BsonSerializationArgs args = default(BsonSerializationArgs));
86+
87+
void Serialize(
88+
IBsonWriter bsonWriter,
89+
Type nominalType,
90+
object value,
91+
Action<BsonSerializationContext.Builder> configurator = null,
92+
BsonSerializationArgs args = default(BsonSerializationArgs));
93+
94+
IBsonClassMapDomain1 BsonClassMap { get; }
95+
96+
IConventionRegistryDomain1 ConventionRegistry { get; }
97+
98+
IBsonDefaults1 BsonDefaults { get; }
99+
}
100+
101+
internal interface IBsonClassMapDomain1
102+
{
103+
IEnumerable<BsonClassMap> GetRegisteredClassMaps();
104+
105+
bool IsClassMapRegistered(Type type);
106+
107+
BsonClassMap LookupClassMap(Type classType);
108+
}
109+
110+
internal interface IConventionRegistryDomain1
111+
{
112+
IConventionPack Lookup(Type type);
113+
}
114+
115+
internal interface IBsonDefaults1
116+
{
117+
IBsonSerializer DynamicArraySerializer { get; }
118+
IBsonSerializer DynamicDocumentSerializer { get; }
119+
int MaxDocumentSize { get; }
120+
int MaxSerializationDepth { get; }
121+
}

src/MongoDB.Bson/Builders/Example.cs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/* Copyright 2010-present MongoDB Inc.
2+
*
3+
* Licensed under the Apache License, Version 2.0 (the "License");
4+
* you may not use this file except in compliance with the License.
5+
* You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software
10+
* distributed under the License is distributed on an "AS IS" BASIS,
11+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
* See the License for the specific language governing permissions and
13+
* limitations under the License.
14+
*/
15+
16+
using System;
17+
using MongoDB.Bson.Serialization;
18+
using MongoDB.Bson.Serialization.Conventions;
19+
20+
namespace MongoDB.Bson.Builders;
21+
22+
internal class Example
23+
{
24+
public void ExampleTest()
25+
{
26+
var domain = new SerializationDomainBuilder()
27+
.RegisterDiscriminator(typeof(P1), "myDiscriminator")
28+
.RegisterSerializer(new CustomSerializer())
29+
.UseNullIdChecker(true)
30+
.ConfigureClassMap(classMapBuilder =>
31+
{
32+
classMapBuilder
33+
.RegisterClassMap<P2>(cm =>
34+
{
35+
cm.AutoMap();
36+
cm.SetIgnoreExtraElements(true);
37+
})
38+
.TryRegisterClassMap<P3>();
39+
})
40+
.ConfigureConventionRegistry(conventions =>
41+
{
42+
conventions.Register(
43+
name: "camelCase",
44+
conventions: new ConventionPack { new CamelCaseElementNameConvention() },
45+
filter: t => true);
46+
})
47+
.ConfigureBsonDefaults(defaults =>
48+
{
49+
defaults
50+
.SetMaxDocumentSize(10 * 1024 * 1024);
51+
})
52+
.Build();
53+
}
54+
}
55+
56+
internal class P1;
57+
internal class P2;
58+
59+
internal class P3;
60+
internal class CustomSerializer : IBsonSerializer<P1>
61+
{
62+
public P1 Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) => new P1();
63+
public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
64+
{
65+
throw new NotImplementedException();
66+
}
67+
68+
public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, P1 value) { }
69+
public Type ValueType => typeof(P1);
70+
object IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
71+
{
72+
return Deserialize(context, args);
73+
}
74+
}

0 commit comments

Comments
 (0)