2012-04-20 19 views

risposta

24

In the official documentation si precisa che MongoServer, MongoDatabase, e MongoCollection sono thread-safe, e che si suppone di creare un unico MongoServer per ogni database che si connette a.

Così, MongoServer, MongoDatabase e MongoCollection possono essere configurati in modo sicuro per essere singleton. MongoServer aiuterà anche a far rispettare ciò restituendo la stessa istanza MongoDatabase per le chiamate successive e MongoDatabase farà la stessa cosa per MongoCollection s.

I.e. la tua istanza MongoServer può essere configurata in modo sicuro per avere uno stile di vita singleton nel tuo contenitore IoC, e potresti anche impostare l'iniezione per MongoDatabase e forse anche MongoCollection.

sto usando questa strategia con Windsor me stesso - è possibile vedere il mio MongoInstaller qui: https://gist.github.com/2427676 - permette mie classi di andare avanti e lo fanno:

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

al fine di avere una collezione iniettato, bello e pronto all'uso

+0

Grazie per aver condiviso WindsorInstaller. Il codice è piuttosto vecchio ora e mi chiedevo se hai una versione aggiornata per il nuovo mongodriver 2.0? Ho provato ad aggiornarlo da solo, ma non sono sicuro che ci sia un modo migliore? ' https://gist.github.com/kri5t/afcba8068badb62f5c9b –

2

Iniettarlo utilizzando qualsiasi contenitore IOC (structuremap, Windsor ecc.) E mantenere la sua durata in base alle richieste.

+0

Ciò significa creare un'istanza del server per thread di richiesta. Presumo che il driver gestisca il pool di connessioni. È corretto? – Roman

+1

Sì, il 'MongoServer' gestisce un pool di connessioni e NON è pensato per essere istanziato più e più volte. Vedi http://www.mongodb.org/display/DOCS/CSharp+Driver+Tutorial#CSharpDriverTutorial-TheC%23Driver per maggiori informazioni ("Creerai un'istanza di questa classe per ogni server a cui ti colleghi. il server viene gestito automaticamente dietro le quinte (viene utilizzato un pool di connessioni per aumentare l'efficienza). ") – mookid8000

7

Il driver C# gestisce automaticamente le connessioni al server (utilizza un pool di connessioni). Non è necessario chiamare il server. Connetti mentre il driver si connette automaticamente. Non chiamare server.Disconnect poiché chiude tutte le connessioni nel pool di connessioni e interferisce con un pool di connessioni efficiente.

Per quanto riguarda la gestione del ciclo di vita dell'istanza MongoServer, è possibile archiviarlo in una variabile statica e utilizzarlo per tutta la durata del processo (e condividerlo su thread, è thread-safe). In alternativa, puoi chiamare nuovamente MongoServer.Create ogni volta che è necessario ottenere l'istanza del server. Finché continuerai a chiamare MongoServer.Create con la stessa stringa di connessione, continuerai a recuperare la stessa istanza di MongoServer.

Problemi correlati