2012-04-20 9 views

Respuesta

24

En the official documentation se afirma que MongoServer, MongoDatabase y MongoCollection es seguro para subprocesos, y que se supone que debes crear una sola MongoServer para cada base de datos que se conecta.

Por lo tanto, MongoServer, MongoDatabase y MongoCollection se pueden configurar de manera segura para que sean únicos. MongoServer incluso ayudará a aplicar esto devolviendo la misma instancia MongoDatabase para llamadas sucesivas, y MongoDatabase hará lo mismo para MongoCollection s.

I.e. su instancia MongoServer se puede configurar de manera segura para tener un estilo de vida singleton en su contenedor IoC, y también podría configurar la inyección para MongoDatabase y tal vez incluso MongoCollection.

estoy usando esta estrategia con Windsor a mí mismo - se puede ver mi MongoInstaller aquí: https://gist.github.com/2427676 - que permite a mis clases sólo seguir adelante y hacer esto:

public class SomeClass 
{ 
    public SomeClass(MongoCollection<Person> people) 
    { ... } 
} 

con el fin de tener una colección inyectado, agradable y listo para usar.

+0

Gracias por compartir el WindsorInstaller. El código es algo viejo ahora y me preguntaba si tienes una versión actualizada para el nuevo mongodriver 2.0. Traté de actualizarlo yo mismo, pero no estoy seguro de si hay una mejor manera? ' https://gist.github.com/kri5t/afcba8068badb62f5c9b –

2

Inyectarlo utilizando cualquier contenedor IOC (structuremap, Windsor, etc.) y mantener su vida útil bajo petición.

+0

Eso significa crear una instancia del servidor por cada subproceso de solicitud. Supongo que el controlador maneja el grupo de conexiones. ¿Es eso correcto? – Roman

+1

Sí, el 'MongoServer' administra un grupo de conexiones y NO está destinado a ser instanciado una y otra vez. Consulte http://www.mongodb.org/display/DOCS/CSharp+Driver+Tutorial#CSharpDriverTutorial-TheC%23Driver para obtener más información ("Creará una instancia de esta clase para cada servidor al que se conecte. Las conexiones con el el servidor se maneja automáticamente detrás de las escenas (un grupo de conexiones se usa para aumentar la eficiencia). ") – mookid8000

7

El controlador C# gestiona las conexiones al servidor automáticamente (utiliza un grupo de conexiones). No hay necesidad de llamar al servidor. Conéctese ya que el controlador se conecta automáticamente. No llame al servidor. Desconecte ya que cierra todas las conexiones en el grupo de conexiones e interfiere con la agrupación de conexiones eficiente.

En cuanto a la gestión del ciclo de vida de la instancia de MongoServer, puede almacenarlo en una variable estática y usarlo durante la vida útil de su proceso (y compartirlo entre hilos, es seguro para subprocesos). De forma alternativa, puede llamar a MongoServer.Crear nuevamente cada vez que necesite obtener la instancia del servidor. Mientras siga llamando a MongoServer.Create con la misma cadena de conexión, seguirá recibiendo la misma instancia de MongoServer.

Cuestiones relacionadas