遇到一个坑爹的项目

最近接手了一个坑爹的项目,简直想死。

  1. 在一个公司中,或者一个部门中,会有几个项目,往往某些功能是可以重用,甚至是可以Copy的,例如用户管理,部门,职位等一些公用模块。对于系统架构来说,亦可如此,目前的项目是中一部分模块是单表的增删改,架构类似于O/R Mapping。在ListPageBase类中利用反射。

                       

 /// <summary>
        /// 生成表内容字符串
        /// </summary>
        /// <param name="viewname">视图名称,表名</param>
        /// <param name="ds">数据源</param>
        /// <param name="className">类名</param>
        /// <param name="FK">主键</param>
        /// <param name="URL">查看明细链接地址</param>
        /// <param name="FilterExpression">查询条件</param>
        /// <param name="SortExpression">排序</param>
        /// <returns>html字符串</returns>
        private string GenerateViewBody(string viewname,DataSet ds, string className, string FK, string URL, string FilterExpression, string SortExpression)
        {
            //拼接查询列
            System.Reflection.Assembly ass = System.Reflection.Assembly.LoadFile(Server.MapPath("~") + "\\bin\\EDA.Model.dll");
            string strColumn = "";
            //查找出页面上需要显示的列名
            foreach (DataColumn dc in ds.Tables[0].Columns)
            {
                strColumn += "[" + dc.ColumnName + "],";
            }
            strColumn = strColumn.Substring(0, strColumn.Length - 1);
            Type t = ass.GetType(className);

            Object[] constructParms = new Object[] { _objUser }; //构造器参数
            object obj = (object)Activator.CreateInstance(t, constructParms);//获得className的对象

            //通过方法
            MethodInfo method = t.GetMethod("GetListViewByPage");//通过方法名获得方法

            PageSize = Convert.ToInt32(ViewState["PageSize"]);
            PageIndex = Convert.ToInt32(ViewState["PageIndex"]);
            Object[] param = new Object[] { ds.Tables[0].Columns[0].ColumnName, viewname, PageIndex, PageSize, strColumn, FilterExpression, SortExpression };

            DataTable dt = (DataTable)method.Invoke(obj, param);//obj是对象,method是方法,param就是method方法的参数。,MethodInfo method = t.GetMethod("GetListByPage") 等于是调用的GetListByPage方法

          
。。。。

这样在展示层的代码就很少。通过下面的代码就可以完成页面生成。

      private void bind(string FilterExpression, string SortExpression)
        {
            //step 1:get table column
            Staff _Staff = new Staff(_objUser);
            List<TableColumnStaff> _List_TableColumnStaff = _Staff.CustomeColumn();
            //step 2:generate table content
            GenerateTable(_List_TableColumnStaff, List, "EDA.Model.Entity.Staff", FK, "../systemmanage/StaffMgr.aspx", FilterExpression, SortExpression);
        }

现在这种模块被这个坑爹的项目拿过去了,开始用的很舒服。基本上表建好了,Model类用CodeSmith生成,页面就基本上出来了。

随着项目不断的进行。问题就出来,在主要模块中的不简单这样的操作,对不同的列需要做不同的操作,对列的权限有控制,于是整个悲剧就来了。不断的在重载GenerateViewBody.用关键字去区别于某个页面。方法已经重载了12个,随着用户的二期,三期的进行。项目越改越烂。Bug越修订越多。拿来主义使之崩溃。

  1. 看看原先的代码,我怀疑之前的程序员根本不知道有ViewState这种东西,一个页面的状态保存,全是用的Session,不管报不报错,看着是恶心。
  2. For循环中定义对象,而且往往是循环上万条记录。

…太多,太多。。

原文地址:https://www.cnblogs.com/Enno/p/2805541.html