zoukankan      html  css  js  c++  java
  • 遇到一个坑爹的项目

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

    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循环中定义对象,而且往往是循环上万条记录。

    …太多,太多。。

  • 相关阅读:
    GridView 配合模板实现 合并单元格(多列)
    Parse和Convert的区别
    'EntityValidationErrors' property for more details
    This 在 C# 中的含义
    C# 之 深入理解using
    尝试从数据库进行更新时,遇到..
    处理远程桌面不能复制粘贴解决办法
    Can't load AMD 64-bit .dll on a IA 32-bit platform错误
    MyBatis笔试题
    MyBatis延迟加载和缓存
  • 原文地址:https://www.cnblogs.com/Enno/p/2805541.html
Copyright © 2011-2022 走看看