MongoServer类源码分析

私有变量定义

        #region private static fields
        private static object staticLock = new object();
        private static Dictionary<MongoServerSettings, MongoServer> servers = new Dictionary<MongoServerSettings, MongoServer>();
        #endregion

        #region private fields
        private object serverLock = new object();
        private object requestsLock = new object();
        private MongoServerSettings settings;
        private List<IPEndPoint> endPoints = new List<IPEndPoint>();
        private MongoServerState state = MongoServerState.Disconnected;
        private IEnumerable<MongoServerAddress> replicaSet;
        private Dictionary<MongoDatabaseSettings, MongoDatabase> databases = new Dictionary<MongoDatabaseSettings, MongoDatabase>();
        private MongoConnectionPool primaryConnectionPool;
        private List<MongoConnectionPool> secondaryConnectionPools;
        private int secondaryConnectionPoolIndex; // used to distribute reads across secondaries in round robin fashion
        private int maxDocumentSize = BsonDefaults.MaxDocumentSize; // will get overridden if server advertises different maxDocumentSize
        private int maxMessageLength = MongoDefaults.MaxMessageLength; // will get overridden if server advertises different maxMessageLength
        private Dictionary<int, Request> requests = new Dictionary<int, Request>(); // tracks threads that have called RequestStart
        private IndexCache indexCache = new IndexCache();
        #endregion


创建一个MongoServer对象的实例,采用了工厂模式和线程安全的单例模式。提供了多种重载方法,默认连接为本机。

#region constructors
/// <summary>
/// Creates a new instance of MongoServer. Normally you will use one of the Create methods instead
/// of the constructor to create instances of this class.
/// </summary>
/// <param name="settings">The settings for this instance of MongoServer.</param>
public MongoServer(
MongoServerSettings settings
) {
this.settings = settings.Freeze();

foreach (var address in settings.Servers) {
endPoints.Add(address.ToIPEndPoint(settings.AddressFamily));
}
}
#endregion

#region factory methods
/// <summary>
/// Creates a new instance or returns an existing instance of MongoServer. Only one instance
/// is created for each combination of server settings.
/// </summary>
/// <returns>
/// A new or existing instance of MongoServer.
/// </returns>
public static MongoServer Create() {
return Create("mongodb://localhost");
}

/// <summary>
/// Creates a new instance or returns an existing instance of MongoServer. Only one instance
/// is created for each combination of server settings.
/// </summary>
/// <param name="builder">Server settings in the form of a MongoConnectionStringBuilder.</param>
/// <returns>
/// A new or existing instance of MongoServer.
/// </returns>
public static MongoServer Create(
MongoConnectionStringBuilder builder
) {
return Create(builder.ToServerSettings());
}

/// <summary>
/// Creates a new instance or returns an existing instance of MongoServer. Only one instance
/// is created for each combination of server settings.
/// </summary>
/// <param name="settings">Server settings.</param>
/// <returns>
/// A new or existing instance of MongoServer.
/// </returns>
public static MongoServer Create(
MongoServerSettings settings
) {
lock (staticLock) {
MongoServer server;
if (!servers.TryGetValue(settings, out server)) {
server
= new MongoServer(settings);
servers.Add(settings, server);
}
return server;
}
}

/// <summary>
/// Creates a new instance or returns an existing instance of MongoServer. Only one instance
/// is created for each combination of server settings.
/// </summary>
/// <param name="url">Server settings in the form of a MongoUrl.</param>
/// <returns>
/// A new or existing instance of MongoServer.
/// </returns>
public static MongoServer Create(
MongoUrl url
) {
return Create(url.ToServerSettings());
}

/// <summary>
/// Creates a new instance or returns an existing instance of MongoServer. Only one instance
/// is created for each combination of server settings.
/// </summary>
/// <param name="connectionString">Server settings in the form of a connection string.</param>
/// <returns>
/// A new or existing instance of MongoServer.
/// </returns>
public static MongoServer Create(
string connectionString
) {
if (connectionString.StartsWith("mongodb://")) {
var url
= MongoUrl.Create(connectionString);
return Create(url);
}
else {
var builder
= new MongoConnectionStringBuilder(connectionString);
return Create(builder);
}
}

/// <summary>
/// Creates a new instance or returns an existing instance of MongoServer. Only one instance
/// is created for each combination of server settings.
/// </summary>
/// <param name="uri">Server settings in the form of a Uri.</param>
/// <returns>
/// A new or existing instance of MongoServer.
/// </returns>
public static MongoServer Create(
Uri uri
) {
var url
= MongoUrl.Create(uri.ToString());
return Create(url);
}
#endregion

公开的属性

        #region public properties
        /// <summary>
        /// Gets the admin database for this server.
        /// </summary>
        public virtual MongoDatabase AdminDatabase {
            get { return GetDatabase("admin"); }
        }

        /// <summary>
        /// Gets the connection pool (if connected to a replica set this is the connection pool to the primary).
        /// </summary>
        public virtual MongoConnectionPool ConnectionPool {
            get { return primaryConnectionPool; }
        }

        /// <summary>
        /// Gets the IP end points for this server.
        /// </summary>
        public virtual IEnumerable<IPEndPoint> EndPoints {
            get { return endPoints; }
        }

        /// <summary>
        /// Gets the index cache (used by EnsureIndex) for this server.
        /// </summary>
        public virtual IndexCache IndexCache {
            get { return indexCache; }
        }

        /// <summary>
        /// Gets the max document size for this server (not valid until connected).
        /// </summary>
        public virtual int MaxDocumentSize {
            get { return maxDocumentSize; }
        }

        /// <summary>
        /// Gets the max message length for this server (not valid until connected).
        /// </summary>
        public virtual int MaxMessageLength {
            get { return maxMessageLength; }
        }

        /// <summary>
        /// Gets a list of the members of the replica set (not valid until connected).
        /// </summary>
        public virtual IEnumerable<MongoServerAddress> ReplicaSet {
            get { return replicaSet; }
        }

        /// <summary>
        /// Gets the RequestStart nesting level for the current thread.
        /// </summary>
        public virtual int RequestNestingLevel {
            get {
                int threadId = Thread.CurrentThread.ManagedThreadId;
                lock (requestsLock) {
                    Request request;
                    if (requests.TryGetValue(threadId, out request)) {
                        return request.NestingLevel;
                    } else {
                        return 0;
                    }
                }
            }
        }

        /// <summary>
        /// Gets a read only list of the connection pools to the secondary servers (when connected to a replica set).
        /// </summary>
        public IList<MongoConnectionPool> SecondaryConnectionPools {
            get { return secondaryConnectionPools.AsReadOnly(); }
        }

        /// <summary>
        /// Gets the settings for this server.
        /// </summary>
        public virtual MongoServerSettings Settings {
            get { return settings; }
        }

        /// <summary>
        /// Gets the current state of this server (as of the last operation, not updated until another operation is performed).
        /// </summary>
        public virtual MongoServerState State {
            get { return state; }
        }
        #endregion

未完待续

posted on 2011-04-08 16:25  lirenqing  阅读(743)  评论(0编辑  收藏  举报