单例模式、单列模式

SqlSugarScope原理

SqlSugarScope 内部机质在同一个上下文 是Scope模式,也就是同一个上下文中 真实的SqlSugar对象是同一个,在不同上下文会自动New出不同的对象,而不需要人工处理

解决了单例模式的死锁问题

解决了非单例模式的线程安全问题

解决了 跨方法事务


写法1:IOC单例

//注册上下文: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)

写法2:静态类写法

推荐直接复制使用

  
 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();

例示1:继承方式单例

    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);
             };
         });
    }

示例2: 类调用方式

    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在服务启动后都一个那么说明成功了


关闭
果糖网