MongoDb';的C#驱动程序,是否可以将其封装在通用会话中

本文关键字:封装 会话 是否 驱动程序 MongoDb | 更新日期: 2023-09-27 18:00:31

如果我在这里使用了错误的术语,我很抱歉。我仍然非常熟悉ORM世界,但我一直在玩MongoDb,真的很喜欢我看到的。我不喜欢的一件事是:

var books = bookRepository.GetCollection<BsonDocument>("books");

foreach (var book in books.FindAllAs<Book>())
{
    Console.WriteLine("Author: {0}, Title: {1}", book.Author, book.Title);
}

我已经找到了几个关于在会话中封装NoRM的教程,但我不知道如何使用CSharp驱动程序(Mongodb在其github页面上推荐/拥有的驱动程序)来实现这一点。

我真正想做的是第一个例子:

var bookRepository = MongoRepository<Book>(); // probably should use IoC to resolve this

foreach (var book in books.FindAll())

哇!我可能不是第一个想要这个的人,到处使用字符串似乎有点疯狂,尽管我承认教程只是一个例子。有没有一个"最佳实践"的例子可以用这种方式来设置这一切?

编辑:如果这是疯狂的演讲,而不是如何在Mongo中做事,请告诉我,这是我的第一个测试项目。

MongoDb';的C#驱动程序,是否可以将其封装在通用会话中

以下是我的项目片段:

public static MongoCollection<T> GetCollection<T>(string collectionName = null)
{
    if (string.IsNullOrWhiteSpace(collectionName))
    {
        Type g = typeof (T);
        collectionName = g.Name;
    }
    return MongoServer.Create(Config.MongoConnectionString).GetDatabase(Config.Database).GetCollection<T>(collectionName);
}

现在我不需要将集合名称指定为字符串,除非我想覆盖它:

var collection = GetCollection<MyEntity>();

var collection = GetCollection<MyEntity>("SomeOtherCOllection");

如果你愿意的话,你可以使用一些屈折实用程序''库来复数化你的收藏名称。

此外,如果在实例化集合类时指定了类型,则不需要在Find方法中指定类型,就像我上面提到的那样。

例如,我就是这样做的:

MongoCursor<MyEntity> results = collection.FindAll();

MongoCursor<MyEntity> results = collection.Find(query);