Skip to content

Commit 752bcd3

Browse files
committed
refactored attributes to be self-sufficient and moved code out of BsonClassMap into the attributes.
1 parent 8f12d9a commit 752bcd3

17 files changed

+208
-138
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ obj
55
*.suo
66
*.vsp
77
*.csproj.VisualState.xml
8+
*.cache
89

910
# MonoDevelop artifacts
1011
*.pidb

Bson/Bson.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@
101101
<Compile Include="Serialization\Conventions\ExtraElementsMemberConventions.cs" />
102102
<Compile Include="Serialization\Conventions\IgnoreIfDefaultConventions.cs" />
103103
<Compile Include="Serialization\Conventions\SerializationOptionsConventions.cs" />
104+
<Compile Include="Serialization\IBsonClassMapModifier.cs" />
105+
<Compile Include="Serialization\IBsonMemberMapModifier.cs" />
104106
<Compile Include="Serialization\Options\ArraySerializationOptions.cs" />
105107
<Compile Include="Serialization\Options\BsonBaseSerializationOptions.cs" />
106108
<Compile Include="Serialization\Options\DateTimeSerializationOptions.cs" />

Bson/Serialization/Attributes/BsonDefaultValueAttribute.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace MongoDB.Bson.Serialization.Attributes
2424
/// Specifies the default value for a field or property.
2525
/// </summary>
2626
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
27-
public class BsonDefaultValueAttribute : BsonSerializationOptionsAttribute
27+
public class BsonDefaultValueAttribute : Attribute, IBsonMemberMapModifier
2828
{
2929
// private fields
3030
private object _defaultValue;
@@ -70,5 +70,19 @@ internal bool SerializeDefaultValueWasSet
7070
{
7171
get { return _serializeDefaultValueWasSet; }
7272
}
73+
74+
/// <summary>
75+
/// Applies a modification to the member map.
76+
/// </summary>
77+
/// <param name="memberMap">The member map.</param>
78+
public void Apply(BsonMemberMap memberMap)
79+
{
80+
memberMap.SetDefaultValue(_defaultValue);
81+
if (_serializeDefaultValueWasSet)
82+
{
83+
memberMap.SetIgnoreIfNull(false);
84+
memberMap.SetIgnoreIfDefault(!_serializeDefaultValue);
85+
}
86+
}
7387
}
7488
}

Bson/Serialization/Attributes/BsonDiscriminatorAttribute.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace MongoDB.Bson.Serialization.Attributes
2424
/// Specifies the discriminator and related options for a class.
2525
/// </summary>
2626
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
27-
public class BsonDiscriminatorAttribute : BsonSerializationOptionsAttribute
27+
public class BsonDiscriminatorAttribute : Attribute, IBsonClassMapModifier
2828
{
2929
// private fields
3030
private string _discriminator;
@@ -74,5 +74,19 @@ public bool RootClass
7474
get { return _rootClass; }
7575
set { _rootClass = value; }
7676
}
77+
78+
/// <summary>
79+
/// Applies a modification to the class map.
80+
/// </summary>
81+
/// <param name="classMap">The class map.</param>
82+
public void Apply(BsonClassMap classMap)
83+
{
84+
if (_discriminator != null)
85+
{
86+
classMap.SetDiscriminator(_discriminator);
87+
}
88+
classMap.SetDiscriminatorIsRequired(_required);
89+
classMap.SetIsRootClass(_rootClass);
90+
}
7791
}
7892
}

Bson/Serialization/Attributes/BsonElementAttribute.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace MongoDB.Bson.Serialization.Attributes
2424
/// Specifies the element name and related options for a field or property.
2525
/// </summary>
2626
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
27-
public class BsonElementAttribute : BsonSerializationOptionsAttribute
27+
public class BsonElementAttribute : Attribute, IBsonMemberMapModifier
2828
{
2929
// private fields
3030
private string _elementName;
@@ -63,5 +63,18 @@ public int Order
6363
get { return _order; }
6464
set { _order = value; }
6565
}
66+
67+
/// <summary>
68+
/// Applies a modification to the member map.
69+
/// </summary>
70+
/// <param name="memberMap">The member map.</param>
71+
public void Apply(BsonMemberMap memberMap)
72+
{
73+
if (!string.IsNullOrEmpty(_elementName))
74+
{
75+
memberMap.SetElementName(_elementName);
76+
}
77+
memberMap.SetOrder(_order);
78+
}
6679
}
67-
}
80+
}

Bson/Serialization/Attributes/BsonExtraElementsAttribute.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,15 @@ namespace MongoDB.Bson.Serialization.Attributes
2424
/// Indicates that this property or field will be used to hold any extra elements found during deserialization.
2525
/// </summary>
2626
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
27-
public class BsonExtraElementsAttribute : BsonSerializationOptionsAttribute
27+
public class BsonExtraElementsAttribute : Attribute, IBsonMemberMapModifier
2828
{
29+
/// <summary>
30+
/// Applies a modification to the member map.
31+
/// </summary>
32+
/// <param name="memberMap">The member map.</param>
33+
public void Apply(BsonMemberMap memberMap)
34+
{
35+
memberMap.ClassMap.SetExtraElementsMember(memberMap);
36+
}
2937
}
30-
}
38+
}

Bson/Serialization/Attributes/BsonIdAttribute.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace MongoDB.Bson.Serialization.Attributes
2424
/// Specifies that this is the Id field or property.
2525
/// </summary>
2626
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
27-
public class BsonIdAttribute : BsonSerializationOptionsAttribute
27+
public class BsonIdAttribute : Attribute, IBsonMemberMapModifier
2828
{
2929
// private fields
3030
private Type _idGenerator;
@@ -56,5 +56,17 @@ public int Order
5656
get { return _order; }
5757
set { _order = value; }
5858
}
59+
60+
public void Apply(BsonMemberMap memberMap)
61+
{
62+
memberMap.SetElementName("_id");
63+
memberMap.SetOrder(_order);
64+
if (_idGenerator != null)
65+
{
66+
var idGenerator = (IIdGenerator)Activator.CreateInstance(_idGenerator); // public default constructor required
67+
memberMap.SetIdGenerator(idGenerator);
68+
}
69+
memberMap.ClassMap.SetIdMember(memberMap);
70+
}
5971
}
60-
}
72+
}

Bson/Serialization/Attributes/BsonIgnoreAttribute.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace MongoDB.Bson.Serialization.Attributes
2424
/// Indicates that this field or property should be ignored when this class is serialized.
2525
/// </summary>
2626
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
27-
public class BsonIgnoreAttribute : BsonSerializationOptionsAttribute
27+
public class BsonIgnoreAttribute : Attribute
2828
{
2929
}
3030
}

Bson/Serialization/Attributes/BsonIgnoreExtraElementsAttribute.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace MongoDB.Bson.Serialization.Attributes
2424
/// Specifies whether extra elements should be ignored when this class is deserialized.
2525
/// </summary>
2626
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
27-
public class BsonIgnoreExtraElementsAttribute : BsonSerializationOptionsAttribute
27+
public class BsonIgnoreExtraElementsAttribute : Attribute, IBsonClassMapModifier
2828
{
2929
// private fields
3030
private bool _ignoreExtraElements;
@@ -65,5 +65,15 @@ public bool Inherited
6565
get { return _inherited; }
6666
set { _inherited = value; }
6767
}
68+
69+
/// <summary>
70+
/// Applies a modification to the class map.
71+
/// </summary>
72+
/// <param name="classMap">The class map.</param>
73+
public void Apply(BsonClassMap classMap)
74+
{
75+
classMap.SetIgnoreExtraElements(_ignoreExtraElements);
76+
classMap.SetIgnoreExtraElementsIsInherited(_inherited);
77+
}
6878
}
6979
}

Bson/Serialization/Attributes/BsonIgnoreIfDefaultAttribute.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace MongoDB.Bson.Serialization.Attributes
2424
/// Indicates whether a field or property equal to the default value should be ignored when serializing this class.
2525
/// </summary>
2626
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
27-
public class BsonIgnoreIfDefaultAttribute : BsonSerializationOptionsAttribute
27+
public class BsonIgnoreIfDefaultAttribute : Attribute, IBsonMemberMapModifier
2828
{
2929
// private fields
3030
private bool _value;
@@ -55,5 +55,16 @@ public bool Value
5555
{
5656
get { return _value; }
5757
}
58+
59+
// public methods
60+
/// <summary>
61+
/// Applies a modification to the member map.
62+
/// </summary>
63+
/// <param name="memberMap">The member map.</param>
64+
public void Apply(BsonMemberMap memberMap)
65+
{
66+
memberMap.SetIgnoreIfNull(false);
67+
memberMap.SetIgnoreIfDefault(_value);
68+
}
5869
}
5970
}

Bson/Serialization/Attributes/BsonIgnoreIfNullAttribute.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace MongoDB.Bson.Serialization.Attributes
2424
/// Indicates whether a field or property equal to null should be ignored when serializing this class.
2525
/// </summary>
2626
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
27-
public class BsonIgnoreIfNullAttribute : BsonSerializationOptionsAttribute
27+
public class BsonIgnoreIfNullAttribute : Attribute, IBsonMemberMapModifier
2828
{
2929
// private fields
3030
private bool _value;
@@ -55,5 +55,15 @@ public bool Value
5555
{
5656
get { return _value; }
5757
}
58+
59+
/// <summary>
60+
/// Applies a modification to the member map.
61+
/// </summary>
62+
/// <param name="memberMap">The member map.</param>
63+
public void Apply(BsonMemberMap memberMap)
64+
{
65+
memberMap.SetIgnoreIfDefault(false);
66+
memberMap.SetIgnoreIfNull(_value);
67+
}
5868
}
59-
}
69+
}

Bson/Serialization/Attributes/BsonKnownTypesAttribute.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace MongoDB.Bson.Serialization.Attributes
2424
/// Specifies the known types for this class (the derived classes).
2525
/// </summary>
2626
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = true)]
27-
public class BsonKnownTypesAttribute : BsonSerializationOptionsAttribute
27+
public class BsonKnownTypesAttribute : Attribute, IBsonClassMapModifier
2828
{
2929
// private fields
3030
private Type[] _knownTypes;
@@ -56,5 +56,17 @@ public Type[] KnownTypes
5656
{
5757
get { return _knownTypes; }
5858
}
59+
60+
/// <summary>
61+
/// Applies a modification to the class map.
62+
/// </summary>
63+
/// <param name="classMap">The class map.</param>
64+
public void Apply(BsonClassMap classMap)
65+
{
66+
foreach (var type in _knownTypes)
67+
{
68+
classMap.AddKnownType(type);
69+
}
70+
}
5971
}
60-
}
72+
}

Bson/Serialization/Attributes/BsonRequiredAttribute.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,15 @@ namespace MongoDB.Bson.Serialization.Attributes
2424
/// Indicates that a field or property is required.
2525
/// </summary>
2626
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
27-
public class BsonRequiredAttribute : BsonSerializationOptionsAttribute
27+
public class BsonRequiredAttribute : Attribute, IBsonMemberMapModifier
2828
{
29+
/// <summary>
30+
/// Applies a modification to the member map.
31+
/// </summary>
32+
/// <param name="memberMap">The member map.</param>
33+
public void Apply(BsonMemberMap memberMap)
34+
{
35+
memberMap.SetIsRequired(true);
36+
}
2937
}
3038
}

Bson/Serialization/Attributes/BsonSerializationOptionsAttribute.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ namespace MongoDB.Bson.Serialization.Attributes
2626
/// <summary>
2727
/// Abstract base class for serialization options attributes.
2828
/// </summary>
29-
public abstract class BsonSerializationOptionsAttribute : Attribute
29+
public abstract class BsonSerializationOptionsAttribute : Attribute, IBsonMemberMapModifier
3030
{
3131
// constructors
3232
/// <summary>
@@ -35,5 +35,26 @@ public abstract class BsonSerializationOptionsAttribute : Attribute
3535
protected BsonSerializationOptionsAttribute()
3636
{
3737
}
38+
39+
public virtual void Apply(BsonMemberMap memberMap)
40+
{
41+
var memberSerializer = memberMap.GetSerializer(memberMap.MemberType);
42+
var memberSerializationOptions = memberMap.SerializationOptions;
43+
if (memberSerializationOptions == null)
44+
{
45+
var memberDefaultSerializationOptions = memberSerializer.GetDefaultSerializationOptions();
46+
if (memberDefaultSerializationOptions == null)
47+
{
48+
var message = string.Format(
49+
"A serialization options attribute of type {0} cannot be used when the serializer is of type {1}.",
50+
BsonUtils.GetFriendlyTypeName(this.GetType()),
51+
BsonUtils.GetFriendlyTypeName(memberSerializer.GetType()));
52+
throw new NotSupportedException(message);
53+
}
54+
memberSerializationOptions = memberDefaultSerializationOptions.Clone();
55+
memberMap.SetSerializationOptions(memberSerializationOptions);
56+
}
57+
memberSerializationOptions.ApplyAttribute(memberSerializer, this);
58+
}
3859
}
3960
}

0 commit comments

Comments
 (0)