上篇文章说了一些关于三层的基础知识。三层包括UI(界面层)、BLL(业务逻辑层)、DAL(数据处理层)。
三层之间的关系?
(此图是依靠自己的理解画的,如果有不正确的地方,欢迎各位帮忙指正!)
在上图中有一个Model层,下面对这个进行一下介绍……
Model是什么呢?举个例子:如果UI层、BLL层、DAL层是饼干,现在把这三块饼干做成一个夹心饼干,那么Model就是夹心饼干的”心“。
比如安装电脑、分3部分、安装显示屏、安装主板、安装软件、第一个人安装好显示屏、会有传送带把电脑送到第二个人那、第二个人安好主板、放到传送带上、传送带也会运到第三个人那、如果没有传送带是不是每个人都要跑过去送? model就是那个传送带、把每一层的参数保存、然后其他层引用model这个类
为什么要分层呢?什么时候不用分层呢?
分层的目的就是为了“高内聚,低耦合”。当软件很小、要求速度、特殊需要的时候可以不用分层。
什么时候需要分层?
在软件上说如果你的程序到达了一定的复杂程度、就可以分层,如果软件特别简单,就没有必要分层。
各层的作用是什么?
1、UI层:
UI设计的原则:用户之上,兼顾简洁。向用户展现特定业务数据;采集用户的输入信息和操作。主要表示WEB方式,也可以表示成WINFORM方式,WEB方式也可以表现成:aspx,如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务。
2、BLL层:从DAL中获取数据,以供UI显示;从UI中获取用户指令和数据,执行业务逻辑;从UI中获取用户指令和数据,通过DAL写入数据源。即:B层就是从D层获取数据来提供给UI层使用,从UI层获取用户指令和数据,执行业务逻辑,传给D层写入数据源。
3、DAL层:从数据源加载数据;向数据源写入数据(Insert/Update);从数据源删除数据,即是对数据库的操作,而不是数据,具体为业务逻辑层或表示层提供数据服务。
三层有什么优点?
1、开发人员可以只关注整个结构中的有一层
2、可以很容易的用新的实现来替换原有层次的实现
3、可以减低层与层之间的依赖
4、有利于各层逻辑的复用
5、便于团队开发。只要各层接口在开发前规定好,那么各层可以独立开发,进化或维护。
6、在后期维护的时候极大的降低了维护成本和维护时间
三层有什么缺点?
1、降低了系统的性能。如果不采用分层式结构,很多业务可以直接访问数据库,来获得相关的数据,现在必须通过中间者来访问数据。
2、又可以会导致级联修改。如果在表层中需要增加一个功能,为保证其设计符合封层式的结构,可能需要在相应的业务逻辑层和数据访问层中增加相应的代码。
代码展示:
UI层:
using System.Windows.Forms;
using LoginModel;//要加上这两行的程序集
private void button1_Click(object sender, EventArgs e)
{
UserInfo user = new LoginModel.UserInfo();
user.UserName = txtUserName.Text.Trim();
user.Password = txtPassword.Text;
LoginBLL.LoginManager mgr = new LoginBLL.LoginManager();//访问B层,需要添加应用bll
//mgr.Login(user.UserName,user.Password);
UserInfo user1 =mgr.Login(user.UserName,user.Password);
MessageBox.Show("登录用户:" + user.UserName);
BLL层
namespace LoginBLL
{
public class LoginManager
{
public LoginModel.UserInfo Login(string Username, string password)
{
LoginDAL.UserDAO uDao = new LoginDAL.UserDAO();
if (user != null)//如果登录成功
{
return user;
}
else
{
throw new Exception("登录失败!");
}
}
}
DAL层
namespace LoginDAL
{
public class UserDAO//验证用户名和密码
{
public LoginModel.UserInfo SelectUser(string userName,string password)
{
//using 可以自动关闭 sqlconnection是数据库的打开的连接
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.Text;//commandtype命令文本
cmd.Parameters.Add(new SqlParameter("@UserName", userName));
cmd.Parameters.Add(new SqlParameter("@Password", password));
cmd.CommandText = @"SELECT ID,UserName,Password,Email FROM USERS WHERE UserName=@UserName and Password=@Password";
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();//执行者
LoginModel.UserInfo user = null;
while(reader.Read())
{
if (user==null)
{
user = new LoginModel.UserInfo();
}
user.ID = reader.GetInt32(0);
user.UserName= reader.GetString(1);
user.Password = reader.GetString(2);
if (!reader.IsDBNull(3))
{
user.Email = reader.GetString(3);
}
}
return user;
}
}
}
namespace LoginDAL
{
class DbUtil
{
public static string ConnString = @"Server=DESKTOP;Database=Login;User ID=sa;Password=123456";//字段
}
Model层
namespace LoginModel//在三层之间传输数据的
{
public class UserInfo
{
public int ID { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Email { get; set; }
}
}