第四道菜——解耦

实体类参数化技巧
本文介绍了一种在.NET环境中将实体类转换为SqlParameter数组的方法,通过定义接口和具体实现,使得实体类能够携带参数名及值,并能被序列化,从而简化了数据访问层的参数传递过程。
     
    原创者:星火幽蓝                  创建时间:2009-10-1

      从上道菜中,我们看到实体类不应该含有SqlParameter的对象。
      所以这里就要教你一个方法,如何可以有效地做到传递参数,又可以序列化实体类。

(1)要解耦,必须要依赖抽象,而不能依赖具体的类,所以我先定义了一个实体类的接口,用它来制作SqlParameter参数。

namespace Model
{
   public interface IModel
   {
       /// <summary>
       /// 第奇数个存放参数名,第偶数个存放前一个参数的值。
       /// </summary>
       string[] Paras
       {
           get;
       }
   }
}

(2)具体的实体类实现这个接口。

namespace Model
{
    [Serializable]
    public class EmployeeModel : IModel
    {
        /// <summary>

        /// 实体类构造函数,默认制作数据库参数

        /// </summary>

        public EmployeeModel()

       {

           m_paras = new List<string>();

       }

 

       /// <summary>

       /// 第奇数个存放参数名,第偶数个存放前一个参数的值。

        /// </summary>

        private List<string> m_paras;

        public string[] Paras

        {

            get { return m_paras.ToArray(); }

        }


        private string m_EAccount;
        public string EAccount
        {
            get { return m_EAccount; }
            set
            {
                m_EAccount = value;
                m_paras.Add("EAccount");
                m_paras.Add(value.ToString());
            }
        }
 

       private string m_Psw;

       public string Psw

        {

            get { return m_Psw; }

            set

            {

                m_Psw = value;

                m_paras.Add("Psw");

                m_paras.Add(value.ToString());

            }

        }

    }

}

(3)下面就在数据访问层利用接口制作SqlParameter参数了:

        #region 把实现了IMode接口的类转化为SqlParameter参数数组

        /// <summary>

        /// 把Model类转化SqlParameter参数

        /// </summary>

        /// <param name="model"></param>

        /// <returns></returns>

        private SqlParameter[] ConvertParas(IModel model)

        {

            if (model == null) return null;

            List<SqlParameter> m_paras = new List<SqlParameter>();

            string[] parasStr = model.Paras;

 

            for (int i = 0; i < parasType.Length; i++)

            {

                m_paras.Add(new SqlParameter(parasStr[i * 2], parasStr[i * 2 + 1]));

            }

            return m_paras.ToArray();

        }

        #endregion

所以只要是实现了IModel的实体类,就可以直接转化为SqlParameter的数组。
      在通用的DataBase中可以以下定义:
      public int RunInt(string procName, IModel model)
        {
            SqlParameter[] prams = ConvertParas(model);
            return RunInt(procName, prams);
        }

      在数据访问层中,只需要以下定义:
      public int AddEmployee(EmployeeModel model)
      {
          DataBase db=new DataBase();
          return db.RunInt("Employee_Add", model);
      }
 
不知道我讲清楚了没有,不过这样做的话,真的让我方便好多。

转载于:https://www.cnblogs.com/zhanchaojiang/archive/2009/10/01/1577226.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值