三层以及注入的一点疑惑
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所要获取的数据结构,也可以通过业务层来指—AL来获取。