簡體   English   中英

Mongo DB類重構

[英]Mongo DB Class Refactoring

在以下情況下,重寫Mongo序列化程序的最佳方法是:

我有以下課程

public Class Quest
{
   public ObjectId _id {get; set;}
   public string Name {get; set;}
   public List<string> GalleryImagePaths {get; set;}
}

進行重構后,GalleryImagePaths屬性將重構為

public List<HttpFile> GalleryImagePaths {get; set;}

public Class HttpFile 
{
  string FilePath {get; set;}
  string UriPath {get; set;}
}

現在默認的序列化器無法反序列化為

List<string> GalleryImagePaths

並且新的數據文檔將存儲在新的架構中。

什么是最佳做法?

BsonSerializer類是靜態且不可繼承的,因此在這種情況下,我認為自定義序列化器將有助於序列化/反序列化。
例如:

using System.Reflection;
using MongoDB.Bson;
using MongoDB.Bson.IO;
using MongoDB.Bson.Serialization;

// Custom Serializer
public static class MyBsonSerializer
{
    public static Quest DeserializeQuest(BsonDocument bson)
    {
        Quest quest = new Quest();
        var properties = typeof(Quest).GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList();

        foreach (var element in bson.Elements)
        {
            switch (element.Name)
            {
                case "GalleryImagePaths":
                    List<HttpFile> paths = new List<HttpFile>();
                    foreach (var path in element.Value.AsBsonArray)
                    {
                        var httpFile = new HttpFile();
                        // Set FilePath and UriPath
                        paths.Add(httpFile);
                    }
                    quest.GalleryImagePaths = paths;
                    break;
                case "_id":
                    properties.First(p => p.Name == element.Name).SetValue(quest, new ObjectId(element.Value.ToString()));
                    break;
                case "Name":
                    properties.First(p => p.Name == element.Name).SetValue(quest, element.Value.ToString());
                    break;
            }
        }
        return quest;
    }

    public static BsonDocument SerializeQuest(Quest quest)
    {
        BsonDocument bson = new BsonDocument();
        bson.Add(new BsonElement("Name", quest.Name));
        var paths = quest.GalleryImagePaths.Select(h => h.UriPath); 
        // OR quest.GalleryImagePaths.Select(h => h.FilePath)
        bson.Add(new BsonElement("GalleryImagePaths", new BsonArray(paths)));

        return bson;
    }
}

反序列化:

var collection = db.GetCollection<BsonDocument>("Quest");
var filter = Builders<BsonDocument>.Filter.Eq("Name", "sample");
Quest quest = MyBsonSerializer.DeserializeQuest(collection.Find(filter).FirstOrDefault());

序列化(和插入):

collection.InsertOne(MyBsonSerializer.SerializeQuest(quest));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM