使用仓储模式


创建仓储

直接复制不需要改任何东西

1、单库模式

    public class Repository<T> : SimpleClient<T> where T : class, new()
    {
        public Repository(ISqlSugarClient context = null) : base(context)//注意这里要有默认值等于null
        {
            base.Context = DbScoped.SugarScope;
        }

    }

2、多租户模式

DbScoped.Sugar 是注入对象,如果还不会注入请看这里学习:https://www.donet5.com/Doc/10/2262

根据不同的实体获取相应的连接对象,当然你也可以封装的更好根据实体特性获取不同的ConfigId

public class Repository<T> : SimpleClient<T> where T : class, new()
{
    protected ITenant itenant = null;//多租户事务
    public Repository(ISqlSugarClient context = null) : base(context)//注意这里要有默认值等于null
    {
      var configId = typeof(T).GetCustomAttribute<TenantAttribute>().configId;
      //根据特性指定具体使用哪个库
      base.Context = DbScoped.SugarScope.GetConnection(configId);
      itenant = DbScoped.SugarScope;
    }

}
public class UserManager : Repository<UserInfo>
{
    //创用仓储方式
    public UserInfo Login(string userName, string password)
    {
        //使用仓储方式 IsAny
        return base.GetSingle(it => it.UserName == userName && it.Password == password);
    }

    //使用db处理复杂对象
    public List<Order> GetMapping()
    {
        var db = base.Context;//使用注入的db对象
        var result = db.Queryable<Order>()
            .Mapper(it => it.Items, it => it.Items.First().OrderId)
            .ToList();
        return result;
    }

    //使用事务
    public void TestTran()
    {
        try
        {
            itenant.BeginTran();

            base.Insert(new UserInfo() { });
            var orderDal= base.ChangeRepository<Repository<Order>>();//切换仓储
            orderDal.Insert(new Order() { });

            itenant.CommitTran();
        }
        catch (Exception ex)
        {
            itenant.RollbackTran();
            throw ex;
        }
    }
}

实体加上标识区分走哪个库 (SqlSugar 5.0.2.9 支持了自带特性)

 [TenantAttribute("1")]
  public class C1Table
  {
     public string Id { get; set; }
  }
 
  [TenantAttribute("2")]
  public class C2Table
  {
      public string Id { get; set; }
  }
果糖网