当前位置 : 主页 > 网络编程 > ASP >

ABP引入SqlSugar框架的简单版创建使用

来源:互联网 收集:自由互联 发布时间:2023-01-17
目录 一 新建类库 声明实体 二 基本仓储 三 实现SqlSugar的DB 四 实现依赖注入 五 应用层使用 上一篇引入了Dapper框架,估计大家都会用了。但是很多都被封装,想探究原理的小伙伴就很失
目录
  • 一 新建类库
    • 声明实体
  • 二 基本仓储
    • 三 实现SqlSugar的DB
      • 四 实现依赖注入
        • 五 应用层使用

          上一篇引入了Dapper框架,估计大家都会用了。但是很多都被封装,想探究原理的小伙伴就很失望了。那么今天的SqlSugar就说说大概思路。简单版和ABP的关联比较少,未来我还会写一期切合ABP框架的,小伙伴稍等下。

          一 新建类库

          为了代码清晰,我新建了一个类库。引入了SqlSugar的框架包,2个仓储类,1个DbContext

          声明实体

              [SugarTable("BasBloodLevel")]
              public class BasBloodLevel
              {
                  [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
                  public int Id { get; set; }
                  public string Code { get; set; }
              }

          二 基本仓储

          先实现基本仓储IBaseRepository 与BaseRepository

              /// <summary>
              /// 基类接口,其他接口继承该接口
              /// </summary>
              /// <typeparam name="TEntity"></typeparam>
              public interface IBaseRepository<TEntity> where TEntity : class
              {
                  /// <summary>
                  /// 根据ID查询
                  /// </summary>
                  /// <param name="objId"></param>
                  /// <returns></returns>
                  Task<TEntity> QueryByID(object objId);
                  /// <summary>
                  /// 添加
                  /// </summary>
                  /// <param name="model"></param>
                  /// <returns></returns>
                  Task<bool> Add(TEntity model);
                  /// <summary>
                  /// 修改
                  /// </summary>
                  /// <param name="model"></param>
                  /// <returns></returns>
                  Task<bool> Update(TEntity model);
                  /// <summary>
                  /// 删除
                  /// </summary>
                  /// <param name="ids"></param>
                  /// <returns></returns>
                  Task<bool> DeleteByIds(object[] ids);
              }
              /// <summary>
              /// 基类实现
              /// </summary>
              /// <typeparam name="TEntity"></typeparam>
              public class BaseRepository<TEntity> : DbContext<TEntity>, IBaseRepository<TEntity> where TEntity : class, new()
              {
                  /// <summary>
                  /// 写入实体数据
                  /// </summary>
                  /// <param name="model"></param>
                  /// <returns></returns>
                  public async Task<bool> Add(TEntity model)
                  {
                      //这里需要注意的是,如果使用了Task.Run()就会导致 sql语句日志无法记录改成下面的
                      //var i = await Task.Run(() => Db.Insertable(model).ExecuteCommand());
                      var i = await Db.Insertable(model).ExecuteCommandAsync();
                      return i > 0;
                  }
                  /// <summary>
                  /// 根据ID删除
                  /// </summary>
                  /// <param name="ids"></param>
                  /// <returns></returns>
                  public async Task<bool> DeleteByIds(object[] ids)
                  {
                      var i = await Db.Deleteable<TEntity>().In(ids).ExecuteCommandAsync();
                      return i > 0;
                  }
                  /// <summary>
                  /// 根据ID查询一条数据
                  /// </summary>
                  /// <param name="objId"></param>
                  /// <returns></returns>
                  public async Task<TEntity> QueryByID(object objId)
                  {
                      return await Db.Queryable<TEntity>().InSingleAsync(objId);
                  }
                  /// <summary>
                  /// 更新实体数据
                  /// </summary>
                  /// <param name="model"></param>
                  /// <returns></returns>
                  public async Task<bool> Update(TEntity model)
                  {
                      //这种方式会以主键为条件
                      var i = await Db.Updateable(model).ExecuteCommandAsync();
                      return i > 0;
                  }
              }

          三 实现SqlSugar的DB

          此处的ConnectionString 地址,我们可以直接读取 ABP框架的配置文件,但是为了方便我直接写死了

              public class DbContext<T> where T : class, new()
              {
                  public DbContext()
              {
                  Db = new SqlSugarClient(new ConnectionConfig()
                  {
          //数据库地址我们可以直接读取 ABP框架的配置文件,但是为了方便我直接写死了
                      ConnectionString = "Server=****; Database=****; Uid=sa; Pwd=****;MultipleActiveResultSets=true;",
                      DbType = DbType.SqlServer,
                      InitKeyType = InitKeyType.Attribute,//从特性读取主键和自增列信息
                      IsAutoCloseConnection = true,//开启自动释放模式
                  });
                  //调式代码 用来打印SQL 
                  Db.Aop.OnLogExecuting = (sql, pars) =>
                  {
                      Console.WriteLine(sql + "\r\n" +
                          Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
                      Console.WriteLine();
                  };
              }
              //注意:不能写成静态的
              public SqlSugarClient Db;//用来处理事务多表查询和复杂的操作
              public SimpleClient<T> CurrentDb { get { return new SimpleClient<T>(Db); } }//用来操作当前表的数据
              public SimpleClient<BasBloodLevel> BasBloodLevelDb { get { return new SimpleClient<BasBloodLevel>(Db); } }//用来处理User表的常用操作
          }

          四 实现依赖注入

          这样我们就能全局使用了

              [DependsOn(typeof(AbpZeroCoreModule))]
              public class Module : AbpModule
              {
                  public override void Initialize()
                  {
                      IocManager.Register(typeof(IBaseRepository<>), typeof(BaseRepository<>), DependencyLifeStyle.Singleton);
                      //依赖注入程序集 
                      IocManager.RegisterAssemblyByConvention(typeof(Module).GetAssembly());
                  }
              }

          既然要实现依赖注入,那肯定要初始化这个类触发注入了。我选择在EF层里加,这样可以不影响原有的EF层初始化

          五 应用层使用

          直接引用对应的IBaseRepository仓储

              public class BasBloodBreedAppService : BloodTestLibSystemAppServiceBase,IApplicationService
              {
                  private  IBaseRepository<BasBloodLevel> _baseRepository { get; set; }
                  public BasBloodBreedAppService(IBaseRepository<BasBloodLevel> baseRepository) {
                      _baseRepository = baseRepository;
                  }
                  public async Task<BasBloodLevel> GetBase() {
                     var ce=await _baseRepository.QueryByID(1);
                      return ce;
                  }
              }

          证明一下我是成功的

          此刻引入SqlSugar就完成了。但是他确实了很ABP很多好用的操作。

          下一篇继续优化,更多关于ABP引入SqlSugar框架的资料请关注自由互联其它相关文章!

          上一篇:ASP.NETWebAPI导入CSV
          下一篇:没有了
          网友评论