最近接手了一个坑爹的项目,简直想死。
- 在一个公司中,或者一个部门中,会有几个项目,往往某些功能是可以重用,甚至是可以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越修订越多。拿来主义使之崩溃。
- 看看原先的代码,我怀疑之前的程序员根本不知道有ViewState这种东西,一个页面的状态保存,全是用的Session,不管报不报错,看着是恶心。
- For循环中定义对象,而且往往是循环上万条记录。
…太多,太多。。