关于在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 : BaseCategory
和BaseCategory
为abstract
。
以上似乎有效,唯一的问题是生成的集合BaseCategorization'1
的奇怪名称,以及我不知道这种设计是否适合MongoDb条款的事实。
答案 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>
替换为您的类型,并为该集合命名。