using Bootstrap.Security; using Longbow.Configuration; using Microsoft.Extensions.Primitives; using MongoDB.Bson; using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization.Serializers; using MongoDB.Driver; namespace Bootstrap.Client.DataAccess.MongoDB { /// /// 数据库操作类 /// internal static class DbManager { private static IMongoDatabase _db = null; private static bool _register = false; private static readonly object _locker = new object(); /// /// /// private static IMongoDatabase BADatabase { get { if (_db == null) { lock (_locker) { if (!_register) { _register = true; ChangeToken.OnChange(() => ConfigurationManager.AppSettings.GetReloadToken(), () => _db = null); InitClassMap(); } if (_db == null) InitDb("ba"); } } return _db; } } #region Collections /// /// Dicts 集合 /// public static IMongoCollection Dicts { get { return BADatabase.GetCollection("Dicts"); } } /// /// Users 集合 /// public static IMongoCollection Users { get { return BADatabase.GetCollection("Users"); } } /// /// Roles 集合 /// public static IMongoCollection Roles { get { return BADatabase.GetCollection("Roles"); } } /// /// Groups 集合 /// public static IMongoCollection Groups { get { return BADatabase.GetCollection("Groups"); } } /// /// Menus 集合 /// public static IMongoCollection Menus { get { return BADatabase.GetCollection("Navigations"); } } #endregion private static void InitDb(string name = null) { var (connectString, databaseName) = Longbow.Data.DbManager.GetMongoDB(name); var client = new MongoClient(connectString); _db = client.GetDatabase(databaseName); } private static void InitClassMap() { BsonSerializer.RegisterSerializer(DateTimeSerializer.LocalInstance); if (!BsonClassMap.IsClassMapRegistered(typeof(BootstrapDict))) { BsonClassMap.RegisterClassMap(md => { md.AutoMap(); md.IdMemberMap.SetSerializer(new StringSerializer(BsonType.ObjectId)); md.IdMemberMap.SetIgnoreIfDefault(true); }); } if (!BsonClassMap.IsClassMapRegistered(typeof(User))) { BsonClassMap.RegisterClassMap(md => { md.AutoMap(); md.IdMemberMap.SetSerializer(new StringSerializer(BsonType.ObjectId)); md.IdMemberMap.SetIgnoreIfDefault(true); }); } if (!BsonClassMap.IsClassMapRegistered(typeof(BootstrapMenu))) { BsonClassMap.RegisterClassMap(md => { md.AutoMap(); md.IdMemberMap.SetSerializer(new StringSerializer(BsonType.ObjectId)); md.IdMemberMap.SetIgnoreIfDefault(true); md.UnmapMember(m => m.CategoryName); md.UnmapMember(m => m.Active); md.UnmapMember(m => m.ParentName); md.UnmapMember(m => m.Menus); }); } if (!BsonClassMap.IsClassMapRegistered(typeof(BootstrapGroup))) { BsonClassMap.RegisterClassMap(md => { md.AutoMap(); md.IdMemberMap.SetSerializer(new StringSerializer(BsonType.ObjectId)); md.IdMemberMap.SetIgnoreIfDefault(true); }); } if (!BsonClassMap.IsClassMapRegistered(typeof(Group))) { BsonClassMap.RegisterClassMap(md => { md.AutoMap(); }); } if (!BsonClassMap.IsClassMapRegistered(typeof(Role))) { BsonClassMap.RegisterClassMap(md => { md.AutoMap(); md.IdMemberMap.SetSerializer(new StringSerializer(BsonType.ObjectId)); md.IdMemberMap.SetIgnoreIfDefault(true); }); } } } }