首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

三层以及流入的一点疑惑

2012-10-21 
三层以及注入的一点疑惑DAL中有public DataSet GetList(string strWhere)BLL中也有 public DataSet GetLis

三层以及注入的一点疑惑
DAL中有 public DataSet GetList(string strWhere)
BLL中也有 public DataSet GetList(string strWhere)

1、在很多地方需要调用GetList,传入的strWhere为防止注入需要进行过滤,但是过滤字符串又不是万能的。所以是否有必要写一个 public DataSet GetList(string strWhere,Sqlparameter [] parameters).

2、既然分层,DAL负责数据,strWhere这个参数很明显需要知道数据库结构,所以是不是应该把所有调用GetList方法写入DAL。

如果1有必要,2没必要。那在表示层的.cs文件里会需要Using System.Data.SqlClient. 引入命名空间过多会不会有效率问题?如果没有,Visual Studio中的“组织Using”有什么作用?

[解决办法]
LZ没有弄懂三层,楼上的也没有弄明白LZ需要什么。

我觉得LZ是不知道DAL层有个getList,为什么BLL还有一个。

LZ,DAL层是数据访问层,他的方法实现了以后,在BLL层封装,所以BLL层的getList就是DAL层的封装形式。

LZ如果想重载那个方法的话,在DAL层写一个多参数的方法,然后根据某个参数是否为空判断需要执行不同的SQL语句。

然后再BLL层封装多个不同参数个数但同名的方法。

调用的时候就会出现重载选择。
[解决办法]
楼上 说的不错。
我在补充一下 上网大多的例子在BLL层只是返回一个list<T>而已 你也不用纠结这个 因为实际开发中 BLL层是要处理很多业务的。基本上自己练习写的项目业务逻辑很简单,BLL只能返回数据。
而且你上面的写的public DataSet GetList(string strWhere,Sqlparameter [] parameters).
你在UI上面写这个 想要防止注入不可行的。public DataSet GetList(string strWhere,Sqlparameter [] parameters).这个是要写在DAL层的

C# code
//辅助类public int Operation(string sql, params SqlParameter[] paras)        {            Connection.Open();            SqlCommand comm = new SqlCommand(sql, Connection);            if (paras.Length > 0)            {                comm.Parameters.AddRange(paras);            }            int result = comm.ExecuteNonQuery();            connection.Close();            return result;        }//DAL public void insertInfo(SalseGoodsModel salse)       {           StringBuilder sql = new StringBuilder();           sql.Append("insert into salseGoods( salseID,salseMoney,salseNum,collectMoney,retrieveMoney,adminID)");           sql.Append(" values(@salseID,@salseMoney,@salseNum,@colltectMoney,@retrieveMoney,@adminID)");           SqlParameter[] parameter = new SqlParameter[]           {                new SqlParameter("salseID",salse.salseID),                new SqlParameter("salseMoney",salse.slaseMoney),                new SqlParameter("salseNum",salse.salseNum),                new SqlParameter("colltectMoney",salse.collectMoney),                new SqlParameter("retrieveMoney",salse.retrieveMoney),                new SqlParameter("adminID",salse.adminid)           };           db.Operation(sql.ToString(), parameter);       }    }//BLLpublic void CreateGoodsBillInfo(SalseGoodsModel salesDetailed,ref string bill )      {          salesDetailed.salseID = CreateGoodsBill();          bill = salesDetailed.salseID;          salseGoodsDAL.insertInfo(salesDetailed);      }
[解决办法]
1、在很多地方需要调用GetList,传入的strWhere为防止注入需要进行过滤,但是过滤字符串又不是万能的。所以是否有必要写一个 public DataSet GetList(string strWhere,Sqlparameter [] parameters).
------------------------
个人感觉过滤的问题是分项目的,一般给企业或政府做项目,基本上没有必要过滤,只要控制可输入的字符串不要过长,在前台显示的时候进行编码即可。


2、既然分层,DAL负责数据,strWhere这个参数很明显需要知道数据库结构,所以是不是应该把所有调用GetList方法写入DAL。
--------------------------------------------
如果不喜欢strWhere 你也可以传入实体模型作为参数,同时在属性 get上进行验证,都是可以的。
[解决办法]
LZ,你提的问题是否可以理成这样三个:
1.使用参数,是否可以有效地预防SQL注入
2.直接在DAL层处理业务关系就好了,为什么还需要BLL层来专门处理业务逻辑
3.过多的引用程序集,会不会对性能构成影响
[解决办法]
还有一点啊,strWhere要知道数据结构,和是否要把调用GetList()的方法写入DAL,是没有因果关系的。
strWhere所要获取的数据结构,也可以通过业务层来指定DAL来获取。

热点排行