日期:2014-05-17  浏览次数:20423 次

三层以及注入的一点疑惑
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);
       }
    }
//BLL
public 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来获取。