使用複合設計模式擴展持久化的CURD,Select能力

      你們可能會常常遇到接口須要常常增長新的方法和實現,但是咱們原則上是不建議平凡的增長修改刪除接口方法,熟不知這樣使用接口是否是正確的接口用法,好比我見到不少的項目分層都是IDAL,DAL,IBLL,BLL,使用了2層接口,名義上是數據隔離和業務隔離,可是會使代碼難調試,難維護,有可能代碼寫的很差或者需求變動形成IBLL,BLL,IDAL,DAL的所有修改,這真的是代碼架構之瘍。程序員

      基於上述觀點,我i重構DAL來廢除IDAL,IBLL形成的架構臃腫redis

image

使用模板模式建立Get和GetList方法,使他具備分頁和多表查詢,事務查詢的能力sql

使用命令模式建立AddWhere方法,使他具備Where族的能力,能處理複雜SQL查詢的能力mongodb

經過此模式,程序員能夠在BLL中自由組合Where,Order,Gounp by不須要寫一個方法,不再會在DAL中出現GetByName,GetListByType這樣的方法。架構

如需遷移redis和mongodb,建議從新搞一套redis的Baseide

代碼大體以下spa

AbsSelectBase.cs3d

public class AbsSelectBase<T> where T : BaseModel
    {
        private List<absWhere> lWhere { get; set; }
        public PageModel page { get; set; }
        protected string Table { get; set; }
        public RBase1()
        {
            page = new PageModel();
            lWhere = new List<absWhere>();
            Init();
        }
       
        protected virtual void Init()
        {

        }
        public virtual List<T> GetList(MySqlTransaction tran = null)
        {
            string where;
            var lpar = GetWhere(out where);
            var list = new List<T>();
            if (page.Order_field.IsNull())
            {
                page.Order_field = "Id desc";
            }
            if (page.Current_Page.HasValue)
            {
                list = GetPageList("", page.Order_field, Table, page, where, "", lpar, tran);
            }
            else
            {
                list = Query("select * from " + Table + " where " + where, page.Order_field, lpar, tran);
            }
            return list;
        }
        public void AddWhere(absWhere where)
        {
            lWhere.Add(where);
        }
        public T Get(MySqlTransaction tran = null)
        {
            page.Current_Page = 1;
            page.Page_Size = 1;
            var entity = GetList(tran).FirstOrDefault();
            return entity;
        }
        public virtual DynamicParameters GetWhere(out string where)
        {
            DynamicParameters lpar = new DynamicParameters();
            where = " IsValid=1 ";
            foreach (var ewhere in lWhere)
            {
                where += ewhere.CreateWhere(lpar);
            }
                lWhere.clear();
               lWhere=null;
            return lpar;
        }
        public object GetCount(MySqlTransaction tran = null)
        {
            string where = "";
            var lpar = GetWhere(out where);
            var res = SqlConnections.Sqlconnection.Query<int>("select count(1) from " + Table + " where " + where, lpar, tran);
            return res;
        }

        protected virtual List<T> GetPageList(string Field, string Order, string Table, PageModel model, string Where, string bigOrderBy = null, object param = null,
            MySqlTransaction sqlTransation = null)
        {
            var res = SqlConnections.Sqlconnection.GetPageList<T>(Field, Order, Table, model, Where, bigOrderBy, param, sqlTransation).ToList();
            return res;
        }
      

    }

ConcreteSelectA.cs調試

public class RScoreRecordSelect : RBase1<ScoreRecord>
    {
        public RScoreRecordSelect()
        {
        }


    }

ConcreteSelectB.cs,多表code

/// <summary>
    /// ProductBuy inner join User
    /// </summary>
    public class RProBuyUserSelect : RBase1<ProductBuy>
    {
        public override List<ProductBuy> GetList(MySql.Data.MySqlClient.MySqlTransaction tran = null)
       {
           string where;
           var lpar = GetWhere(out where);
           var list = new List<ProductBuy>();
           string table = @" User  inner join ProductBuy  on User.ID=ProductBuy.UserID ";
           if (page.Order_field.IsNull())
           {
               page.Order_field = "ProductBuy.Id desc";
           }
           if (page.Current_Page.HasValue)
           {
               list = GetPageList("", page.Order_field, table, page, where, "", lpar, tran);
           }
           else
           {
               list = Query("select ProductBuy.* from " + table + " where " + where, page.Order_field, lpar, tran);
           }
           return list;
       }
       public override CZCore.Data.DynamicParameters GetWhere(out string where)
       {
           DynamicParameters lpar = new DynamicParameters();
           where = " User.IsValid=1 and ProductBuy.IsValid=1 ";
           foreach (var ewhere in lWhere)
           {
               where += ewhere.CreateWhere(lpar);
           }
           return lpar;
       }
       public enum EnumOrder
       {
           /// <summary>
           /// 
           /// </summary>
           [Category("UserAct.BuyCount")]
           [Description("")]
           _0,
           /// <summary>
           /// 
           /// </summary>
           [Category("UserAct.BuyMoney")]
           [Description("")]
           _1,
           /// <summary>
           /// 
           /// </summary>
           [Category("UserAct.CashScore")]
           [Description("")]
           _2,
           /// <summary>
           /// 
           /// </summary>
           [Category("DBB.Money")]
           [Description("")]
           _3,
           /// <summary>
           /// 
           /// </summary>
           [Category("DBB.Score")]
           [Description("")]
           _4
       }
    }

absWhere.cs

public abstract class absWhere
    {
        private string _field;
        public string field
        {
            get
            {
                return _field;
            }
            set
            {
                _field = value;
            }
        }
        public object value { get; set; }
        private string _par;
        public string par
        {
            get
            {
                if (_par.IsNull())
                {
                    _par = field.Replace(".","");
                }
                return _par;
            }
            set
            {
                _par = value;
            }
        }
       
       public abstract string CreateWhere(DynamicParameters lpar);
    }

WhereAndIn.cs

public class WhereAndIn : absWhere
    {
        
        public override string CreateWhere(CZCore.Data.DynamicParameters lpar)
        {
            
            string sql="";
            if (value.IsNull() == false)
            {
                sql = " and "+field+" in @"+par+" ";
                lpar.Add(par, value);
            }
            return sql;
        }
    }

WhereAndLike.cs

public class WhereAndLike : absWhere
    {
        
        public override string CreateWhere(CZCore.Data.DynamicParameters lpar)
        {
            
            string sql="";
            if (value.IsNull() == false)
            {
                sql = " and "+field+" like @"+par+" ";
                lpar.Add(par, "%"+value+"%");
            }
            return sql;
        }
    }

單表查詢

image

多表查詢

image

 

 

 

image

簡單的處理增刪改查主鍵,等於Entity屬性的簡單查詢不分頁功能,並在上層提供一個總的facade門面

AbsBase.cs

public class RBase<T> where T : BaseModel
    {

        public List<T> GetAll(MySqlTransaction tran = null)
        {

            var list = SqlConnections.Sqlconnection.GetAll<T>(tran);
            return list;

        }

        public T GetById(object id, MySqlTransaction tran = null)
        {

            var res = SqlConnections.Sqlconnection.GetById<T>(id, tran);
            return res;

        }

        public UInt64 Insert(T T, MySqlTransaction tran = null, MySqlConnection _conn = null, bool IsAuto = true)
        {

            var res = SqlConnections.Sqlconnection.Insert<T>(T, tran, IsAuto);
            return res;

        }

        public void Insert(List<T> list, MySqlTransaction tran = null, MySqlConnection _conn = null)
        {

            SqlConnections.Sqlconnection.Insert<T>(list, tran);

        }

        public void Update(T T, MySqlTransaction tran = null, MySqlConnection _conn = null)
        {

            SqlConnections.Sqlconnection.Update<T>(T, tran);

        }

        public void Update(List<T> list, MySqlTransaction tran = null, MySqlConnection _conn = null)
        {

            SqlConnections.Sqlconnection.Update<T>(list, tran);

        }

        public List<T> Search(T t, MySqlTransaction tran = null, MySqlConnection _conn = null)
        {

            var res = SqlConnections.Sqlconnection.Search<T>(t, tran);
            return res;

        }

        public bool Delete(object id, bool isDelete = false, MySqlTransaction tran = null, MySqlConnection _conn = null)
        {

            var res = SqlConnections.Sqlconnection.Delete<T>(id, tran, isDelete: isDelete);
            return res;

        }

        public void DeleteBySearch(T t, bool isDelete = false, MySqlTransaction tran = null, MySqlConnection _conn = null)
        {

            SqlConnections.Sqlconnection.DeleteBySearch<T>(t, tran, isDelete: isDelete);

        }

        public RBase()
        {
            Init();
        }

        public virtual void Init()
        {

        }




      

        public void TruncateTable(MySqlTransaction sqlTransation = null)
        {
            bool result = Execute(
                 string.Format(
                 "Truncate Table {0}",
                 "`" + typeof(T).Name.ToLower() + "`"
          ), null, sqlTransation) > 0;
        }



    }

Concrete1.cs

public class RScoreRecord:RBase<ScoreRecord>
    {
    }

Facade.cs

image

Model層封裝Entity層,並懶加載Entity數據,只加載關聯id一級數據

MUser.cs

public class MUser
    {
       private User eUser;
       public MUser(User _eUser)
       {
           eUser=_eUser;
        
       }
       private UserAct eUserAct;
       public UserAct GetEUserAct(MySql.Data.MySqlClient.MySqlTransaction ts = null)
       {
           if (eUserAct == null)
           {
               eUserAct = RCommon.rUserAct.GetById(eUser.Id,ts);
           }
           return eUserAct;
       }
       private DBB eDBB;
       public DBB GetDBB(MySql.Data.MySqlClient.MySqlTransaction ts=null)
       {
           if (eDBB == null)
           {
               eDBB = RCommon.rdbb.GetById(eUser.Id,ts);
           }
           return eDBB;
       }

    }
相關文章
相關標籤/搜索