初识三层,请多指教

用三层写登录
首先搭建三层:Model、DAL、BLL、UI层(Model是个实体,不属于三层中的一项)
各层是什么意思就不说了,大家应该都知道。在Model里主要是建立表对应的实体模型,各个属性其实就是表中的各个字段;在DAL层就是对数据库进行访问的操作层,比如用户登录这一操作,需要根据输入的用户名查询数据库判断此用户是否存在;BLL层主要起到隔离UI层与数据访问曾层,也就是通常说的使得表现与行为分离;UI层就是根据从BLL层返回的数据进行相应的显示。
为了简洁,用户表User:FName、FPwd就设两个字段
首先在Model层中建立User表对应的实体类
public class User
{
 private string fName;

        public string FName
        {
            get { return fName; }
            set { fName = value; }
        }
        private string Pwd;

        public string Pwd1
        {
            get { return Pwd; }
            set { Pwd = value; }
        }
}
DAL层首先根据传入的用户名来查找此人是否存在,然后将结果返回给BLL,BLL在将处理后的结果返回给UI,此时要考虑DAL查询出来的是一张二维的数据表,如果直接将表结构的数据返回,那么在调用层还要对表进行处理才能判断登录用户是否存在,而且表中的数据类型复杂,表现层需要对取得的数据进行类型转换,转换失败就会初一意想不到的异常,非常的麻烦。因此在DAL层检索到数据之后我们要返回的类型可以定义为User类型,就是在Model里定义的类型(如果登录用户存在,将该用户在表中的那一行信息转换为一个User对象)
 public User GetuserByUserName(string userName)
        {
            string sql = "select * from User where FName=@name";
            SqlParameter[] paras={
                new SqlParameter("@name",userName)
            };
            Person user = null;
 //调用SqlHelper中的GetTable方法
            DataTable dt = SqlHelper.GetTable(sql, paras);
            if (dt.Rows.Count > 0)
            {
                DataRow dr = dt.Rows[0];
 //RowToUser方法是个关键,用来将表中的一行数据转换成User类的一个实体对象
   user = RowToUser(dr);
            }
            return user;
        }

  //把行转化为对象
        private User RowToUser(DataRow dr)
        {
            User user = new User ();
 //如果字段的指设置为可以为空,那么在转换的时候需要使用DBNull.Value判断该列的值是否为空,如果为空还进行强制转换会引发类型匹配的异常
 //当表中类型为varchar(对应C#为String的类型)可以不用判断,因为ToString之后如果为空会返回“”(空字符串),不会引发异常
            if (dr["FName"] != DBNull.Value)
            {
                per.FName= Convert.ToString(dr["FName"]);
            }
            per.FPwd = Convert.ToDateTime(dr["FPwd "]);
    return user;
 }
此时DAL层返回的对象类型为User,在BLL层只需要对接收到的数据进行逻辑处理即可
  public User Login(string userName)
        {
            return DAL.UserDAL dal = new UserDAL();
        }
之后返回到UI层的就是一个选择问题(返回的User是否为null),是就表示此用户存在,此刻因为数据类型都已经在Model里定义并在DAL里进行好了对应的转换,在进行密码是否正确的验证的时候,只需要获得user对象,调用user.FPwd即可与输入的密码进行比较

备注:该案例中只是为了表现调用user.FPwd有多爽才将密码的验证放到UI层,在BLL层验证所有的数据只返回给UI一个干净利落的结果是最好的做法

原文地址:https://www.cnblogs.com/luseike/p/2697960.html