今天看了看三层,因为王继彬老师的视频里讲的也不是很难,简单介绍了一下基本概念,和写了一个Login实例。今天算是一个开头,想说一说初期对于三层的理解。
看完整个视频后,就画了一张导图,感觉我们要学的东西真的不是很多呀。看下图
三层,从名字上它就知道它是有三个层次的,但是实际上,他们可不止三层,只是从物理和逻辑角度,将软件开发大体分为了三大部分:UI、BLL、DAL。这三层就是一个应用程序了,当然它要想运行起来,或者说想要发挥软件的正常作用,还要再加上一个DB。
如下图:
通过两张图,就已经知道我的未来一段时间的学习方向是什么了,旧知识不懂的找书看,新知识不懂的看书去。
以下来个实例:
Login登陆窗体的三层:
表现层,主要用于与用户交互和B层引用。
LoginUI
namespace LoginUI
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
业务逻辑层,这里对于是否有用户信息进行判断。
LoginBLL
namespace Login.BLL
{
public class LoginManager
{
public Login.Model.UserInfo UserLogin(string userName, string password)
{
Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();
Login.Model.UserInfo user = uDao.SelectUser(userName, password);
if (user != null)// login successfully.
{
Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
sDao.UpdateScore(userName, 10);
return user;
}
else
{
throw new Exception("登录失败。");
}
}
}
}
数据访问层,它不是数据库,但是可以对数据库进行增删改查等操作。
LoginDAL
DbUtil
namespace Login.DAL
{
class DbUtil
{
public static string ConnString = @"Server=wangjibin; Database=Login; User ID=sa; Password=wang_ji_bin";
}
}
积分
ScoreDAO
namespace Login.DAL
{
public class ScoreDAO
{
public void UpdateScore(string userName, int value)
{
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"INSERT INTO SCORES(UserName, Score) Values(@UserName,@Score)";
cmd.Parameters.Add(new SqlParameter("@UserName",userName));
cmd.Parameters.Add(new SqlParameter("@Score",value));
conn.Open();
cmd.ExecuteNonQuery();
}
}
}
}
用户信息
UserDAO
namespace Login.DAL
{
public class UserDAO
{
public Login.Model.UserInfo SelectUser(string userName, string password)
{
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"SELECT ID, UserName, Password,Email
FROM USERS WHERE UserName=@UserName AND Password=@Password";
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new SqlParameter("@UserName",userName));
cmd.Parameters.Add(new SqlParameter("@Password",password));
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
Login.Model.UserInfo user = null;
while (reader.Read())
{
if (user == null)
{
user = new Login.Model.UserInfo();
}
user.ID = reader.GetInt32(0);
user.UserName = reader.GetString(1);
user.Password = reader.GetString(2);// not suggestion
if (!reader.IsDBNull(3))
{
user.Email = reader.GetString(3);
}
}
return user;
}
}
}
}
实体类,在应用程序中会有很多重复的代码,将他们 抽象出实体类。可以使代码得到复用。
LoginModel
namespace Login.Model
{
public class UserInfo
{
public int ID { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Email { get; set; }
}
}
我相信,三层完了后一定会为接下来的学习铺好路的。