三层
2016-02-14 21:06
190 查看
三层介绍
三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。优点
1、开发人员可以只关注整个结构中的其中某一层;2、可以很容易的用新的实现来替换原有层次的实现;
3、可以降低层与层之间的依赖;
4、有利于标准化;
5、利于各层逻辑的复用。
6、结构更加的明确
7、在后期维护的时候,极大地降低了维护成本和维护时间
缺点
1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。
3、增加了开发成本。
为什么使用三层
当你的业务复杂到一定程度上,需要数据存储当相应的数据库中。并不是所有的系统中都需要使用三层结构。业务逻辑简单、没有真正的数据存储层(也就不需要数据访问层)三层的作用
数据访问层1、DAL的作用
从数据源加载数据(Select)
向数据源写入数据(Insert/Update)
从数据源删除数据(Delete)
显示层
1.UI的作用
向用户展现特定业务数据
采集用户的输入信息和操作
2.UI设计的原则
用户至上,兼顾简洁
业务逻辑层
BLL的作用
从DAL中获取数据,以供UI显示用
从UI中获取用户指令和数据,执行业务逻辑
从UI中获取用户指令和数据,通过DAL写入数据源
具体应用----原则
1、DAL只提供基本的数据访问,不包含任何业务相关的逻辑处理2、UI只负责显示和采集用户操作,不包含任何的业务相关的逻辑处理
3、BLL负责处理业务逻辑。通过获取UI传来的操作指令,决定执行业务逻辑,在需要访问数据源的时候直接交给DAL处理。处理完成后,返回必要数据给UI。
demo
当用户登录系统后,数据库中会给用户增加10扣积分。三层的关系图
显示层:View/UI
首先在命名空间添加 using System.Data using System.SqlClient
namespace LoginUI { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnLogin_Click(object sender, EventArgs e) { string userName = txtUserName.Text.Trim(); string password = txtPassword.Text; Login.BLL.LoginManager mgr = new Login.BLL.LoginManager(); Login.Model.UserInfo user=mgr.UserLogin(userName,password); } } }业务逻辑层:BLL(Business Logic Layer)
namespace Login.BLL { public class LoginManager { public Login.Model.UserInfo UserLogin(string userName, string password) { //throw new NotImplementedException(); Login.DAL.UserDAO uDao = new Login.DAL.UserDAO(); Login.Model.UserInfo user= uDao.SelectUser(userName, password); if (user!=null) //login successful { Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO(); sDao.UpdateScore(userName, 10); return user; } else { throw new Exception("登录失败。"); } } } }数据库访问层DAL:(Data Access Layer)
其中在DAL层中需要有ScoreDAO类、UserDAO类和DbUtil类
DbUtil类 中的代码
namespace Login.DAL { class DbUtil { public static string ConnString = @"Server=孙东;Database=Login;User ID=sa;Password=sd2850452"; } }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); if (!reader.IsDBNull(3)) { user.Email = reader.GetString(3); } } return user; } } } }
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(); } } } }实体类
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; } } }数据库需要新建两张表,Users表和Scores表(例子中 使用的为SQL Server)
Users表
Scores表
下面是关于这个例子的一张关系图
相关文章推荐
- CoordinatdBolt原理分析
- 第33讲:List的一阶函数操作代码实战详解
- ubuntu 开始ssh服务 使用xshell工具连接
- 无图片纯css实现中国象棋棋子
- Android-仿知乎日报总结
- uva 10910(子集和问题)
- 数论学习笔记
- 1025. 反转链表 (25)
- 代码的等价性
- UVA 1494 - Qin Shi Huang's National Road System(次小生成树)
- oracle数据库学习(二)
- iptables: Firewall modules are not loaded.
- 正则表达式
- javascript中的BOM和DOM
- hdu 1106 排序
- iOS面试题二
- 小故事:架构师需要做什么?
- 1034. 有理数四则运算
- 仿新闻图片浏览
- 蓝桥杯-开心的金明