【问题标题】:MongoDb serialize generic types (classes)MongoDb 序列化泛型类型(类)
【发布时间】:2014-02-07 00:08:59
【问题描述】:

在 MongoDb 中序列化此类内容的一般建议是什么

    public class BaseCategorization<T> where T : BaseCategory
    {
        public BaseCategorization()
        {
            Type = typeof(T).Name;
        }

        public BaseCategorization(int id)
        {
            Id = id;
            Type = typeof(T).Name;
        }

...
}

我是这样使用的:

_documentsProvider.Save<BaseCategorization<ProductCategory>>(newProductCategorization);

其中ProductCategory : BaseCategoryBaseCategoryabstract

上述方法似乎可行,唯一的问题是生成的集合的奇怪名称BaseCategorization'1,而且我不知道这种设计是否符合 MongoDb 条款。

【问题讨论】:

    标签: c# mongodb serialization


    【解决方案1】:

    您当然可以将所有文档存储在一个集合中,但是从长远来看,仅将一种类型存储在一个集合中可能更容易和更清晰(从 C# 的角度来看)。您可以通过在 MongoDatabase 上创建一个具有扩展方法的类来做到这一点。

    public static class MyDatabase
    {
        public static MongoCollection<T> GetCollection<T>(this MongoDatabase db)
        {
            var name = typeof(T).Name;
            return db.GetCollection<T>(name);
        }
    }
    

    然后,您只需调用 GetCollection 并在其上输入您的类型,该名称将从您的通用代码中隐藏。你也可以创建这样的东西来进一步抽象一些东西:

    public class MyDatabase
    {
        private MongoDatabase _db;
    
        public MyDatabase(MongoDatabase db)
        {
            _db = db;
        }
    
        public MongoCollection<object> Objects
        {
            get
            {
                return _db.GetCollection<object>();
            }
        }
    }
    

    你可以这样做

    var client = new MongoClient();
    var server = client.GetServer();
    var db = server.GetDatabase("MyDb");
    var myDb = new MyDatabase(db);
    myDb.Objects.Find();
    

    Find 将映射以针对Objects 集合执行,只需将&lt;object&gt; 替换为您的类型并为集合命名。

    【讨论】:

      猜你喜欢
      • 2011-07-29
      • 1970-01-01
      • 2014-12-20
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      相关资源
      最近更新 更多