/// <summary> /// 数据库链接字符串 /// </summary> /// <param name="options"></param> /// <returns></returns> static public string ConnectionString(this DBConnectionOptions options) { if (options.ServerAddress.EndsWith("/") || options.Database.StartsWith("/")) { return(options.ServerAddress + options.Database); } return(options.ServerAddress + "/" + options.Database); }
/// <summary> /// 初始化数据库的连接 /// </summary> public static void SetConnection() { // 创建数据库连接信息 if (Connection == null) { Connection = new DBConnection(DBType.MongoDB, OnChange); } if (Connection.ConnectionList.Count == 0) { ApiException.ThrowBadRequest("请填写数据库的连接配置"); } // 为每个数据库连接创建数据库服务 Dictionary <string, MongoProvider> ConnDict = new Dictionary <string, MongoProvider>(); foreach (var conn in Connection.ConnectionList) { conn.Name = conn.Name.ToLower(); LoggerConnect = conn; if (string.IsNullOrWhiteSpace(conn.Name)) { ApiException.ThrowBadRequest("请为连接数据库的字符串指定名称"); } if (ConnDict.ContainsKey(conn.Name)) { continue; } try { // 获取数据链接客户端 IMongoClient MongoClient = new MongoClient(conn.ConnectionString()); // 获取数据库 IMongoDatabase MongoDatabase = MongoClient.GetDatabase(conn.Database); ConnDict.Add(conn.Name, new MongoProvider { Client = MongoClient, Database = MongoDatabase, Connection = conn }); } catch (Exception ex) { // 由于数据库连接字符串容易被外界改变,所以只针对连接字符串出错时记录日志并发送邮件。其它错误应该在测试阶段发现。 DBLog.Logger.Error(ex, "连接MongoDB数据库失败", Connection.ConnectionList); throw new Exception("连接数据库失败,请检查数据库连接字符串"); } } // 根据持久化操作对象的特性创建数据库操作服务 ProviderDict.Clear(); foreach (var map in LoadMapping()) { if (ProviderDict.ContainsKey(map.DALTypeName)) { continue; } if (!ConnDict.ContainsKey(map.ConnectionName)) { ApiException.ThrowBadRequest($"Mongo数据库{map.ConnectionName}连接信息不存在,请检查配置项"); } var db = ConnDict[map.ConnectionName]; ProviderDict.Add(map.DALTypeName, new MongoProvider { Name = map.DALTypeName, Client = db.Client, Database = db.Database, Connection = db.Connection, CollectionName = map.CollectionName, Collection = db.Database.GetType().GetMethod("GetCollection").MakeGenericMethod(map.ModelType).Invoke(db.Database, new object[] { map.CollectionName, null }) }); } }