Exemplo n.º 1
0
        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);
            });
        }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
        /// <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;
            }
        }