SqlSugarScope 内部机质在同一个上下文 是Scope模式,也就是同一个上下文中 真实的SqlSugar对象是同一个,在不同上下文会自动New出不同的对象,而不需要人工处理
解决了单例模式的死锁问题
解决了非单例模式的线程安全问题(异步中需要注意看标题2)
解决了 跨方法事务
但是在异步中还需要注意用法
https://www.donet5.com/Home/Doc?typeId=1224
//注册上下文:AOP里面可以获取IOC对象,如果有现成框架比如Furion可以不写这一行
services.AddHttpContextAccessor();
//注册SqlSugar
services.AddSingleton<ISqlSugarClient>(s =>
{
SqlSugarScope sqlSugar = new SqlSugarScope(new ConnectionConfig()
{
DbType = SqlSugar.DbType.Sqlite,
ConnectionString = "DataSource=sqlsugar-dev.db",
IsAutoCloseConnection = true,
},
db =>
{
//单例参数配置,所有上下文生效
db.Aop.OnLogExecuting = (sql, pars) =>
{
//获取IOC对象不要求在一个上下文
//vra log=s.GetService<Log>()
//获取IOC对象要求在一个上下文
//var appServive = s.GetService<IHttpContextAccessor>();
//var log= appServive?.HttpContext?.RequestServices.GetService<Log>();
};
});
return sqlSugar;
});
//用接口接收
public class(ISqlSugarClient db)推荐直接复制使用
public class SqlSugarHelper //不能是泛型类
{
//如果是固定多库可以传 new SqlSugarScope(List<ConnectionConfig>,db=>{}) 文档:多租户
//如果是不固定多库 可以看文档Saas分库
//用单例模式
public static SqlSugarScope Db= new SqlSugarScope(new ConnectionConfig()
{
ConnectionString = "Server=.xxxxx",//连接符字串
DbType = DbType.SqlServer,//数据库类型
IsAutoCloseConnection = true //不设成true要手动close
},
db=> {
//(A)全局生效配置点
//调试SQL事件,可以删掉
db.Aop.OnLogExecuting = (sql, pars) =>
{
Console.WriteLine(sql);//输出sql,查看执行sql
//5.0.8.2 获取无参数化 SQL
//UtilMethods.GetSqlString(DbType.SqlServer,sql,pars)
};
});
}错误写法1
//错误 => 本质是 get set会一直创建新对象
public static SqlSugarScope Db=> new ...();
//错误 不能get set
public static SqlSugarScope Db{get{ retun new xxx}}
//错误 不能是方法,调一次方法会创建一次
public static SqlSugarScope Db(){ return new xxx}
//错误 SqlSugarClient不能单例只能用 SqlSugarScope
public static SqlSugarClient Db=new ...();
//正确写法
public static SqlSugarScope = new ...();错误写法2:不能在泛型类中new
public class DbContext<T> //错误原因:DbContext<T>.Db 随着T不同他的实例也会不同
{
public static SqlSugarScope Db=new ...(); //应该提取到非泛型类或者IOC单例注入
}
//正确用法
public class DbContext<T>
{
public static SqlSugarScope Db = SqlSugarHelper.Db; //在建一个类
}错误写法3:不能在构造函数内部new
public class DbContext
{
public DbContext()
{
Db=new SqlSugarScope..(); //new一次DbContext会创建一个实例
}
public static SqlSugarScope Db ;
}
//正确用法
public static SqlSugarScope Db=new xxxx(); public class TestManager : DbContext
{
public List<Order> Add()
{
return Db.Queryable<Order>().ToList();
}
}
public class DbContext //如果是泛型类 Db要扔到外面 ,DbContext<T>.Db会导致产生多个实例
{
protected static SqlSugarScope Db = new SqlSugarScope(new ConnectionConfig()
{
DbType = SqlSugar.DbType.SqlServer,
ConnectionString = Config.ConnectionString,
IsAutoCloseConnection = true
},
db => {
//单例参数配置,所有上下文生效
db.Aop.OnLogExecuting = (s, p) =>
{
Console.WriteLine(s);
};
});
} public class TestManager
{
public List<Order> Add()
{
return DbContext.Db.Queryable<Order>().ToList();
}
}
public class DbContext //如果是泛型类 Db要扔到外面 ,DbContext<T>.Db会导致产生多个实例
{
//这里要public
public static SqlSugarScope Db = new SqlSugarScope(new ConnectionConfig()
{
DbType = SqlSugar.DbType.SqlServer,
ConnectionString = Config.ConnectionString,
IsAutoCloseConnection = true
},
db => {
//单例参数配置,所有上下文生效
db.Aop.OnLogExecuting = (s, p) =>
{
Console.WriteLine(s);
};
});
}SqlSugarHelper.Db.HasCode();//只要看这个hascode在服务启动后都一个那么说明成功了
2016 © donet5.comApache Licence 2.0