兼容性问题升级旧客户1.8客户端使用通用框架使用MongoDB 2.0 C#



我正在寻求有关升级我们现有Mongo框架使用新2.0驱动程序的成本的社区指导。

使用现在的遗产mongo c#驱动程序(1.8& 1.9),我们建立了一个用于阅读&的框架。将我们的藏品写给MongoDB。这些集合以特定类型的名字命名 - 例如,"动物视图"的类型写入" Animalview"系列。

编写集合时,每个文档都伴随一个"容器"对象,即mongodbcontainer。"键"是使用GUID构建的GUID或对象,使得进行CRUD操作(使用Legacy或New Mongo驱动程序)非常简单:

public class MongoDbContainer<TKey, TEntity> : IMongoWriter<TKey, TEntity>
{
    public void Add (TKey key, TEntity entity)
    {
        var server = mongoClient.GetServer();
        var db = server.GetDatabase(databaseName);
        var collection = db.GetCollection<TEntity>(typeof(TEntity).Name);
        collection.Insert(entity);
    }
}
public class AnimalWriter
{
    IMongoWriter<AnimalId, AnimalView> writer;
    public AnimalWriter(IMongoWriter<AnimalId, AnimalView> writer)
    {
        this.writer = writer;
    }
    public void CreateAnimal(AnimalData data)
    {
        var view = new AnimalView {… assign from data…};
        writer.Add(data.AnimalId, view);
    }
}

很明显,该框架将相对简单地转换为新驱动程序。但是,我们还有其他几种类型的实体,我们用作索引:

public class Singleton<T>
{
    public string Id { get; set; }
    public T Value { get; set; }
} 
public class Chunk<T>
{
    public byte Id { get; set; }
    public T Value {get; private set; }
}

" Singleton"课程写给了一个名为" Singletons"的Mongo系列,并从Mongo检索到如下:

public MongoCollection<BsonDocument> GetSingletonsCollection()
{
    var server = mongoClient.GetServer();
    var db = server.GetDatabase(databaseName);
    var collection = db.GetCollection("singletons");
}

这是转换为新驱动程序的地方开始分解。单身人士的宗教是单顿价值属性的类型。因此,要检索单身集合以进行更新,因此将其作为Icollection的值类型不足以进行,因为不能保证该类型的企业会干净地映射到Bsondocument。

旧方法:

public void AddSingleton(TEntity entity)
{
    var collection = GetSingletonsCollection();
    var singleton = new Singleton<TEntity>(entity);
    collection.Insert(singleton);
}

旧方法不需要知道该集合的类型比<Singleton<BsonDocument>>更重要。所有的映射和转换都是由驾驶员处理的。但是,新的插入方法有一个问题 - 该集合是<Singleton<BsonDocument>>类型,但是要插入的文档是<Singleton<MyClass>>,因此

collection.InsertOneAsync(entity);

无效,因为实体与集合不同。我尝试将"实体"转换为bsondocument,但是在某些转换失败的类中,尤其是当类包含字典或其他类型时。

这个问题与"块"类更加复杂。与单身人士不同,大块写给了带有"价值"属性名称的蒙戈收藏。但是,ID是一个"字节",不能这样转换为BSON。因此,除了我们与Singleton类相同的通用问题外,我们现在还必须找到一种正确映射ID的方法。

我曾尝试进行反思工作以创建仿制药,但我能做的事情有限,因为我们必须通过反射发现一切 - 方法和属性。此外,构建器扩展方法(过滤器,更新&etc)不可用(或者我不知道如何使用它们),因为它们无法通过反射发现。

我对这个问题的长度和缺乏特定的"操作方法"表示歉意,但是有必要正确描述我们的问题。我们想升级到MongoDB.Driver 2.0,但是考虑到我们可能需要做的重写量,费用可能会过高。在与Legacy 1.X驾驶员在一起的同时,因为它继续工作,我们也担心他们被脱离了支持,除了无法利用Mongo中引入的新功能。

升级到MongoDB 3.0并使用2.0驱动程序是否为时过早(这是工程的进一步变化,还是在这一点上烤到2.0的液体)?我是否误导了试图将我们现有的非生成框架固定在适当的方法?

非常感谢您提供的任何方向。

最终,问题在于对字典对bson serialzation的更改。实施为"单例"的几个类都包含词典来进一步索引信息,并且序列化正在窒息。

通过应用BSON后序列化异常中建议的更改时,解决了问题。错误消息没有直接表现出来,因为它们包含在Task.Exception属性中,该属性是由InsertOneAsync呼叫引起的。

@i3arnon的Kudos撰写了一个写得很好的帖子。

最新更新