第四道菜——解耦

     
    原创者:星火幽蓝                  创建时间: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);
      }
 
不知道我讲清楚了没有,不过这样做的话,真的让我方便好多。

posted @ 2009-10-01 14:38  星火幽蓝  阅读(197)  评论(0)    收藏  举报