我们在开发三层Web应用程序时,通常做法界面访问业务逻辑层对象提供的数据获取服务来获取要呈现的数据(业务逻辑层对象可能访问数据库层对象返回数据)。为了支持界面数据查询要求,业务逻辑层对象需提供用来接收查询条件带参数的获取数据方法。当变更要求増加新的查询条件支持时我们不得不修改三层代码可扩性很差。我的做法业务层方法改为组合对象做为参数,这个自定义集合对象包含参数对象,参数对象有参数名称和条件值及枚举类型判定对象如><=!=等操作符,页面封装参数集合对象传给业务对象转成where条件并组装SQL执行追回数据。但这种做法传入参数名是字段名显然依赖了表字段,当表字段名更改我还需要修改三层代码!大家有什么好的办法?

解决方案 »

  1.   

    Entity穿越多层就行了。修改表的时候只修改Entity字段。
      

  2.   

    只是你应用层次不到家
        /// <summary>
        /// 会员管理
        /// </summary>
        public class User
        {
            /// <summary>
            /// 用户操作接口
            /// </summary>
            Ig_user us = DataAccess.CreateIg_user();        /// <summary>
            /// 根据ID获取用户信息
            /// </summary>
            /// <param name="id"></param>
            /// <returns></returns>
            public g_userinfo getInfoByID(int id)
            {
                string _cond = " id=@id ";            g_userinfo _param = new g_userinfo();
                _param.id = id;            return us.GetInfoByID(_cond, _param);
                    
            }
            /// <summary>
            /// 根据用户名获取用户信息
            /// </summary>
            /// <param name="UserName"></param>
            /// <returns></returns>
            public g_userinfo getInfoByUser(string UserName)
            {
                string _cond = " username=@username ";
                g_userinfo _param = new g_userinfo();
                _param.UserName = UserName;            return us.GetInfoByID(_cond, _param);
            }        public g_userinfo getInfoByUser(string UserName, string Password)
            {
                string _cond = " username=@username and password=@password ";
                g_userinfo _param = new g_userinfo();
                _param.UserName = UserName;
                _param.Password = Password;            return us.GetInfoByID(_cond, _param);
            }
            /// <summary>
            /// 创建用户
            /// </summary>
            /// <param name="info"></param>
            /// <returns></returns>
            public bool Create(g_userinfo info)
            {
                return us.Create(info) > 0;
            }        /// <summary>
            /// 修改用户信息
            /// </summary>
            /// <param name="info"></param>
            /// <returns></returns>
            public bool Update(g_userinfo info)
            {
                string _cond = " id=@id ";            return us.Update(info, _cond) > 0;
            }
            public bool SetPassword(int id, string password)
            {
                string _cond = " id=@id ";
                g_userinfo info = getInfoByID(id);
                if (info == null || info.id<=0) return false;            info.Password = password;            return us.Update(info, _cond) > 0; 
            }
            /// <summary>
            /// 删除用户信息
            /// </summary>
            /// <param name="id"></param>
            /// <returns></returns>
            public bool Delete(int id)
            {
                string _cond = " id=@id ";            g_userinfo _param = new g_userinfo();
                _param.id = id;            return us.Delete(_cond, _param) > 0;
            }        /// <summary>
            /// 获取用户列表
            /// </summary>
            /// <param name="pageindex"></param>
            /// <param name="pagesize"></param>
            /// <param name="keyword"></param>
            /// <param name="rowcount"></param>
            /// <returns></returns>
            public IList<g_userinfo> getInfoList(int pageindex,int pagesize,string keyword,out int rowcount)
            {
                string _cond = " UserName like ('%' + @UserName +'%') or CNName like ('%'+ @UserName +'%')"
                    + " or ENName like ('%'+ @UserName +'%') or Phone like ('%'+ @UserName +'%')";            g_userinfo _param = new g_userinfo();
                _param.UserName = keyword;            rowcount = us.GetRowCount(_cond, _param);            return us.GetInfoList(pageindex, pagesize, " CreaTime DESC,id DESC ", _cond, _param);
            }
        }
      

  3.   

    Chaolin代码给我不少借鉴,dbaccess可以是数据工厂,它可以读取配置信息返回操作特定数据库的对象,getinfoList通过传入查询条件关键字及分页信息后以集合对象返回给客户端,此接口我觉得有如下问题:
    1、只支持针对一个字符串类型的查询条件,只满足一个特定的应用,即使要提供排除掉特定关键字的数据代码都要修改,建议,传入一个查询条件集合对象,这个对象有关键字、判定条件(如=、!=、like 、<、>等)、关键值,这样是不是扩展性更好!
    2、业务逻辑内含了SQL,限制了可支持的数据库。欢迎指教!