2011-06-26 7 views
6

Me disculpo si uso la terminología incorrecta aquí. Todavía estoy en el mundo de ORM, pero he estado jugando con MongoDb y realmente amo lo que veo. Una de las cosas que no me está gustando es la siguiente:Controladores C# de MongoDb, ¿es posible envolverlo en una sesión genérica?

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

Y

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

he encontrado varios tutoriales sobre envolver NoRM in a session pero no puedo encontrar la manera de hacerlo utilizando el CSharp Controladores (los que Mongodb recomienda/tiene en su página github).

Lo que realmente me gustaría hacer es algo como esto para el primer ejemplo:

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

y

foreach (var book in books.FindAll()) 

Voila! Probablemente no soy la primera persona en querer esto, usar cadenas por todos lados parece un poco chiflado, aunque concederé que el tutorial es solo un ejemplo. ¿Hay un ejemplo de "mejores prácticas" para configurar todo esto de esa manera?

Editar: Háganme saber si esto es una locura y no cómo hacer las cosas en Mongo, de nuevo este es mi primer proyecto de prueba.

+0

Lo que estás pidiendo, exactamente? En ORM, aún necesita configurar el ORM para que sepa qué objeto está almacenado en qué tabla; esto te obliga a tener cuerdas. Ciertamente puede mover la cadena con el nombre de la colección de la llamada "obtener repositorio" a un paso "configurar repositorios", similar a las asignaciones de Fluent Nhibernate. – Avish

Respuesta

5

Aquí se fragmento de mi proyecto:

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

Ahora no necesita especificar un nombre de colección como una cadena a menos que quiera anularlo:

var collection = GetCollection<MyEntity>(); 

o

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

Puede usar alguna utilidad de inflexión \ biblioteca para pluralizar sus nombres de colección si lo desea.

Además, no necesita especificar el tipo en sus métodos Find si especificó el tipo al crear una clase de colección, como he dicho anteriormente.

Por ejemplo, esta es la forma en que lo hago:

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

o

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

Estoy en el proceso de crear una clase Mongo DAL genérica. ¿Tiene por casualidad otros métodos como su método GetCollection para CRUD ops que estaría dispuesto a compartir? –

+0

@JeffBorden Lo siento, no. La mayor parte del CRUD fue específico para cada tarea. –

+0

¡Gracias, gracias! –

Cuestiones relacionadas