MongoDb序列化泛型类型(类)

时间:2014-02-07 00:08:59

标签: c# mongodb serialization

关于在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条款的事实。

1 个答案:

答案 0 :(得分:2)

您当然可以将所有文档存储在一个集合中,但从长远来看,仅在集合中存储一种类型(从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集合执行,只需将<object>替换为您的类型,并为该集合命名。