public override void ConfigureServices(IServiceCollection services) { base.ConfigureServices(services); ModelAssemblyRegistry.Instance.AddModelConfigAssembly(this.GetType().Assembly); var versionInfoHelper = VersionInfoHelper.Instance(); services.AddSingleton <IVersionInfoHelper>(sp => versionInfoHelper); services.AddSingleton <VersionInfoHelper>(sp => versionInfoHelper as VersionInfoHelper); var versionInfo = versionInfoHelper.GetVersionInfo(); services.AddSingleton(sp => versionInfo); services.AddOptions <DevSetting>().Bind(Configuration.GetSection("DevSetting")); services.AddScoped(sp => sp.GetService <IOptionsSnapshot <DevSetting> >().Value); services.AddDbContext <BaseDbContext>(async(sp, optionsBuilder) => { var dbContextHelper = sp.GetRequiredService <DbContextHelper>(); var dataProvider = dbContextHelper.GetDataProviderFromConfiguration(Configuration); var fixProvider = dbContextHelper.AutoFixProvider(dataProvider); var connName = "DefaultConnection"; var databaseName = "DemoDb"; //template for non tenant var dbConn = Configuration.GetConnectionString(connName); var myDatabaseHelper = sp.GetRequiredService <DbConnConfigHelper>(); var config = myDatabaseHelper.GetDbConnConfig(connName, dataProvider); if (config == null) { //create tenant Conn from "non tenant" template Conn //eg => replace DemoDb with DemoDb_{tenant} var tenant = myDatabaseHelper.Tenant; var dbConnTenant = dbConn.Replace(databaseName, $"{databaseName}_{tenant}", StringComparison.OrdinalIgnoreCase); config = DbConnConfig.Create( connectionName: connName, dataProvider: fixProvider, connString: dbConnTenant); dbContextHelper.SetupDbContextOptionsBuilder(optionsBuilder, fixProvider, dbConnTenant); await using (var baseDbContext = new BaseDbContext(optionsBuilder.Options)) { await myDatabaseHelper.SaveDbConnConfig(config); var canConnect = await baseDbContext.Database.CanConnectAsync(); if (!canConnect) { await baseDbContext.Database.EnsureCreatedAsync(); } await myDatabaseHelper.SaveDatabaseCreated(databaseName, true); } } dbContextHelper.SetupDbContextOptionsBuilder(optionsBuilder, config.DataProvider, config.ConnectionString); }); }
/// <summary> /// /// <summary> /// 获取当前数据库上下文 /// 根据写库的类型进行数据库类型的判断 /// 支持多数据库类型-工厂拆分 /// </summary> /// </summary> /// <param name="connName"></param> /// <returns></returns> public static IDbContext <T> GetDbContext <T>(string connName = DatabaseFactory.Default_ConnName) where T : BaseEntity, new() { IDbContext <T> dbContext = null; DbConnConfig dbConfig = null; if (string.IsNullOrEmpty(connName)) { //必须有连接配置,如果没有 那么抛出异常 dbConfig = GlobalDBConnection.AllDbConnConfigs.FirstOrDefault().Value; } else { //检测是否有name if (!GlobalDBConnection.AllDbConnConfigs.ContainsKey(connName)) { throw new Exception("指定的数据库连接名称不存在配置中!Name:" + connName); } dbConfig = GlobalDBConnection.AllDbConnConfigs[connName]; } switch (dbConfig.DbType) { case SupportDbType.SQLSERVER: dbContext = new SqlDbContext <T>(dbConfig); break; case SupportDbType.MYSQL: dbContext = new MySqlDbContext <T>(dbConfig); break; case SupportDbType.POSTGRESQL: case SupportDbType.ORACLE: default: throw new NotImplementedException(); } return(dbContext); }
/// <summary> /// 保存数据库连接 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSave_Click(object sender, EventArgs e) { var logObj = Singleton.Container.Resolve <IOutput>(); var connectName = cbConnectStringName.Text.Trim(); var providerName = cbProviderName.Text.Trim(); var connectString = txtConnectString.Text.Trim(); var defaultDb = txtDefaultDb.Text.Trim(); if (string.IsNullOrEmpty(connectName)) { MsgBox.Show("请选择或输入连接名称!"); return; } if (string.IsNullOrEmpty(providerName)) { MsgBox.Show("请选择Provider名称!"); return; } if (string.IsNullOrEmpty(connectString)) { MsgBox.Show("请输入ConnectString内容!"); return; } if (string.IsNullOrEmpty(defaultDb)) { MsgBox.Show("请输入默认数据库!"); return; } try { var model = dal.FindOne(connectName); if (model == null) { model = new DbConnConfig(); model.ConnectionString = connectString; model.Name = connectName; model.ProviderName = providerName; model.DefaultDb = defaultDb; dal.Insert(model); } else { model.ConnectionString = connectString; model.Name = connectName; model.ProviderName = providerName; model.DefaultDb = defaultDb; dal.Update(model); } this.DialogResult = DialogResult.Yes; MsgBox.Show("保存成功!"); } catch (Exception ex) { MsgBox.ShowExceptionMessage(ex); this.DialogResult = DialogResult.No; } }