1 回答

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊
您需要注冊一個(gè)新的序列化程序來處理您的 senario,幸好這個(gè)庫是非??蓴U(kuò)展的,所以您只需要編寫一些需要擴(kuò)展的部分。
因此,首先您需要?jiǎng)?chuàng)建一個(gè)Serializer將您的字符串鍵寫為下劃線大小寫的:
public class UnderscoreCaseStringSerializer : StringSerializer
{
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, string value)
{
value = string.Concat(value.Select((x, i) => i > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString())).ToLower();
base.Serialize(context, args, value);
}
}
現(xiàn)在我們有了一個(gè)可以使用的序列化器,我們可以在 bson 序列化器注冊表中注冊一個(gè)新的字典序列化器,并將我們的新序列化器UnderscoreCaseStringSerializer用于序列化密鑰:
var customSerializer =
new DictionaryInterfaceImplementerSerializer<Dictionary<string, string>>
(DictionaryRepresentation.Document, new UnderscoreCaseStringSerializer(), new ObjectSerializer());
BsonSerializer.RegisterSerializer(customSerializer);
就是這樣......
internal class MyDocument
{
public ObjectId Id { get; set; }
public string Name { get; set; }
public Dictionary<string, string> AdditionalData { get; set; }
}
var collection = new MongoClient().GetDatabase("test").GetCollection<MyDocument>("docs");
var myDocument = new MyDocument
{
Name = "test",
AdditionalData = new Dictionary<string, string>
{
["boardId"] = "149018"
}
};
collection.InsertOne(myDocument);
// { "_id" : ObjectId("5b74093fbbbca64ba8ce9d0e"), "name" : "test", "additional_data" : { "board_id" : "149018" } }
您可能還想考慮使用 aConventionPack來處理您的字段名稱使用下劃線的約定,這只是意味著您不需要用BsonElement屬性亂扔類,它只是按照約定工作。
public class UnderscoreCaseElementNameConvention : ConventionBase, IMemberMapConvention
{
public void Apply(BsonMemberMap memberMap)
{
string name = memberMap.MemberName;
name = string.Concat(name.Select((x, i) => i > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString())).ToLower();
memberMap.SetElementName(name);
}
}
var pack = new ConventionPack();
pack.Add(new UnderscoreCaseElementNameConvention());
ConventionRegistry.Register(
"My Custom Conventions",
pack,
t => true);
- 1 回答
- 0 關(guān)注
- 183 瀏覽
添加回答
舉報(bào)