.net5 简易版本sql 读写分离
关于sqlserver如何配置主从库,请在复制发布订阅那一块操作,后面会出一篇文章
配置Appsetting.json
"DbContext": {
"DbType": "sql",
//"ConnectionString": "Data Source=DESKTOP-23DM9NS; Initial Catalog=ZHIBO; User Id=tudawei;Password=tudawei123456"
//"ConnectionStringSql": "Data Source=niubi;Initial Catalog=ZHIBO; User Id=david;Password=david123456",
"ConnectionString": "Data Source=PC04E0010016\\MSSQLSERVER01;Initial Catalog=ZHIBO; User Id=niubi;Password=123456",
"ReadConnectionString": "Data Source=DESKTOP-23DM9NS; Initial Catalog=ZHIBO; User Id=tudawei;Password=123456789",
"WriteConnectionString": "Data Source=DESKTOP-23DM9NS; Initial Catalog=ZHIBO; User Id=tudawei;Password=123456789"
},
配置Appsetting.json 映射类
public class Appsetting
{
/// <summary>
/// 数据库类型
/// </summary>
public DbType DbType { set;get;}
/// <summary>
/// 连接字符串
/// </summary>
public string ConnectionString{ set; get; }
/// <summary>
/// 读字符串
/// </summary>
public string ReadConnectionString { set; get; }
/// <summary>
/// 写字符串
/// </summary>
public string WriteConnectionString { set; get; }
}
服务注册
services.Configure<Appsetting>(Configuration.GetSection("DbContext"));//appsetting映射到实体
services.AddTransient<IDapperHelper, DapperHelper>();
services.AddTransient<IDateDapper, DateDapper>();
services.AddTransient<DbConnection, SqlConnection>();
数据库相关封装
public interface IDateDapper
{
IDbConnection CreateDb(DbOperate dbOperate);
}
public class DateDapper: IDateDapper
{
private readonly IOptions<Appsetting> _options = null;
private readonly DbConnection _dbConnection = null;
public DateDapper(IOptions<Appsetting> options, DbConnection dbConnection)
{
_options = options;
_dbConnection = dbConnection;
}
public IDbConnection CreateDb(DbOperate dbOperate)
{
IDbConnection idbConnection = null;
switch (_options.Value.DbType)
{
/* case DbType.oracle:
idb = new Oracle();
break;
case DbType.mysql:
idb = new Mysql();
break;*/
case DbType.oracle:
//idbConnection = new OracleConnection();
//_dbConnection.ConnectionString= _options.Value.ConnectionString;
idbConnection = ReadOrWrite(dbOperate);
break;
case DbType.sql:
idbConnection = ReadOrWrite(dbOperate);
//_dbConnection.ConnectionString = _options.Value.ConnectionString;
//idbConnection.ConnectionString = _options.Value.ConnectionString;
break;
default:
throw new Exception("数据库选取错误");
}
return idbConnection;
}
public IDbConnection ReadOrWrite(DbOperate dbOperate)
{
//读出写的数据库,然后随机获取下标,最后取值的时候给上下标就好了
switch (dbOperate)
{
case DbOperate.Read:
_dbConnection.ConnectionString= _options.Value.ReadConnectionString;
break;
case DbOperate.Write:
_dbConnection.ConnectionString = _options.Value.WriteConnectionString;
break;
default:
throw new Exception("读写数据库选取错误!");
}
return _dbConnection;
}
}
public enum DbType {
oracle,
mysql,
sql
}
public enum DbOperate
{
Read,
Write
}
Controller使用
private IDateDapper _dataDapper = null;
// private readonly IBackgroundJobClient _jobClient;
public ValuesController(IDateDapper dataDapper)
{
_dataDapper = dataDapper;
}
[HttpGet]
[NoAuth]
public async Task<IEnumerable<User> > Search()
{
string sql = " select * from ClientUser";
var entity = await _dataDapper.CreateDb(DbOperate.Read).QueryAsync<User>(sql);
return entity;
}