Драйверы MongoDb для C #, возможно ли обернуть его в общий сеанс? - PullRequest
6 голосов
/ 27 июня 2011

Я извиняюсь, если использую здесь неправильную терминологию.Я все еще очень люблю мир 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())

Вуаля!Я, вероятно, не первый человек, который хочет этого, везде использование строк кажется немного сумасшедшим, хотя я допускаю, что учебник - только пример.Есть ли пример «передового опыта» для настройки всего этого таким образом?

Редактировать: Пожалуйста, дайте мне знать, если это сумасшедший разговор, а не как делать вещи в Монго, опять же, это мой первый тестпроект.

1 Ответ

5 голосов
/ 27 июня 2011

Вот фрагмент из моего проекта:

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);
...