之前学习ASP.NETCore及SqlSugar时都是只连接单个数据库处理数据,仅需在Program文件中添加ISqlSugarClient的单例即可(如下代码所示)。
builder.Services.AddSingleton<ISqlSugarClient>(s =>
{
SqlSugarScope sqlSugar = new SqlSugarScope(new ConnectionConfig()
{
DbType = SqlSugar.DbType.SqlServer,
ConnectionString = builder.Configuration.GetValue<string>("dbContext"),
IsAutoCloseConnection = false,
});
return sqlSugar;
});
如果需要连接多个数据库(不是跨数据库联查,仅是连两个数据库),第一时间想到的是创建多个全局实例,在需要的地方直接调用。原先使用Linq的时候经常这么干,每个DBContext对应一个数据库,程序启动时创建多个DBContext实例,然后在WebService中直接使用。
百度“sqlsugar 多数据库”,不少文件介绍使用SqlSugar的多租户或仓储方式连接多数据,没有深入看下去,感觉很麻烦。最后参考百度搜索工具给的建议,创建包含多个ISqlSugarClient属性的类,每个属性对应一个数据库连接,然后调用builder.Services.AddSingleton注册实例服务。大致实现代码如下:
public class MultiDBClient
{
public ISqlSugarClient DB1 { get; set; }
public ISqlSugarClient DB2 { get; set; }
}
builder.Services.AddSingleton<MultiDBClient>(s =>
{
MultiDBClient client = new MultiDBClient();
SqlSugarScope sqlSugar = new SqlSugarScope(new ConnectionConfig()
{
DbType = SqlSugar.DbType.SqlServer,
ConnectionString = builder.Configuration.GetValue<string>("dbContext1"),
IsAutoCloseConnection = true,
});
client.DB1 = sqlSugar;
sqlSugar = new SqlSugarScope(new ConnectionConfig()
{
DbType = SqlSugar.DbType.SqlServer,
ConnectionString = builder.Configuration.GetValue<string>("dbContext2"),
IsAutoCloseConnection = true,
});
client.DB2 = sqlSugar;
return client;
});
public class ECDataController : ControllerBase
{
private ISqlSugarClient m_sugarClient;
public ECDataController(MultiDBClient client, IWebHostEnvironment env, ILoggerProvider logger)
{
m_sugarClient=client.DB2;
}
}
测试了上面的代码,在不同控制器类中按需获取相应的数据库连接使用即可。照着这种思路,针对不同的数据库定义不同的类也可以,全部注册为实例,在控制器类中按需使用可能更简单。
参考文献:
[1]https://www.donet5.com/Home/Doc