什么是三层架构?

  在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。

 

1、表示层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。  

 

2、业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。 

  

 

3、数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、查找等。

 

 

  微软的DNA架构定义了三个层:表示层(presentation),业务逻辑层(business),和数据访问层(data access)。具体又分为:界面外观层、界面规则层、业务接口层、业务逻辑层、实体层、数据访问层、数据存储层共七层,其具体的调用如下图所示:

为什么要用三层架构?

 

   对于一个简单的应用程序来说,代码量不是很多的情况下,一层结构或二层结构开发完全够用,没有必要将其复杂化,如果对一个复杂的大型系统,设计为一层结构或二层结构开发,那么这样的设计存在很严重缺陷。

   分层开发其实是为大型系统服务的。在开发过程中,初级程序人员出现相似的功能经常复制代码,那么同样的代码写那么多次,不但使程序变得冗长,更不利于维护,一个小小的修改或许会涉及很多页面,经常导致异常的产生使程序不能正常运行。最主要的面向对象的思想没有得到丝毫的体现,打着面向对象的幌子却依然走着面向过程的道路。

   意识到这样的问题,初级程序人员开始将程序中一些公用的处理程序写成公共方法,封装在类中,供其它程序调用。例如写一个数据操作类,对数据操作进行合理封装,在数据库操作过程中,只要类中的相应方法(数据添加、修改、查询等)可以完成特定的数据操作,这就是数据访问层,不用每次操作数据库时都写那些重复性 的数据库操作代码。在新的应用开发中,数据访问层可以直接拿来用。面向对象的三大特性之一的封装性在这里得到了很好的体现。现在找到了面向对象的感觉,代码量较以前有了很大的减少,而且修改的时候也比较方便,也实现了代码的重用性。

 


 

优缺点:

(一)优点

1、开发人员可以只关注整个结构中的其中某一层;  

 

2、可以很容易的用新的实现来替换原有层次的实现;  

3、可以降低层与层之间的依赖;   

4、有利于标准化;   

5、利于各层逻辑的复用。

(二)缺点

1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。   

2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。   

3、增加了开发成本。


 

怎么用三层架构?

 

  不是所有的系统都需要使用三层架构,在一开始学习这块知识的时候有可能会存在误区。对于简单的问题我们没有必要把它复杂化,甚至有可能会画蛇添足、多此一举。

 

不需要使用的情况:

            1业务逻辑简单。 

            2、没有真正的数据存储层。

 

需要使用的情况:

   既有数据访问层DAL又有业务逻辑层BLL,也就是说当业务复杂到一定程度后,数据需要单独的存储到相对独立的介质中时,需要把数据访问脱离开业务单独存在,把业务脱离开UI单独存在,UI达到业务只需要呼叫业务访问层即可实现跟用户访问的交互。这种情况下我们才使用三层结构。

 

实例演练:

  现在有一个积分系统,学生每登录一次可获得10积分奖励。代码入下:

 

UI层:

 

 
  1. private void btnLogin_Click(object sender, EventArgs e)

  2. {

  3.  
  4. string userName=txtUsername.Text.Trim();

  5. string password=txtPassword.Text;

  6. LoginBll.LoginManager mgr = new LoginBll.LoginManager(); //实例化一个业务层的LoginManager,用于逻辑判断

  7. LoginModel.UserInfo user= mgr.UserLogin(userName, password); //实例化一个业务层的Model,用于给userlogin赋值name,password

  8. MessageBox.Show("登录用户: " + user.UserName); //显示登录信息

  9.  
  10. }

 

 

BLL层:

 

 
  1. namespace LoginBll

  2. {

  3. //管理登录类,用于判断用户是否登陆成功

  4. public class LoginManager

  5. {

  6. //UI层传递的是UserInfo方法,数据是Username,password

  7. public LoginModel.UserInfo UserLogin(string userName, string password) //UserLogin方法,判断登录信息是否正确

  8. {

  9.  
  10. LoginDAL.UserDAO uDao = new LoginDAL.UserDAO(); //实例化一个数据层登录

  11. LoginModel.UserInfo user = uDao.SelectUser(userName, password); //实例化一个Model,用于给数据层的SelectUser赋值

  12.  
  13. if (user!=null)

  14. {

  15. LoginDAL.SocreDAO sDao = new LoginDAL.SocreDAO();

  16. sDao.UpdateScore(user.ID ,userName, 10);//增加积分

  17. return user;

  18. }

  19. else

  20. {

  21. throw new Exception("登录失败");

  22. }

  23. }

  24. }

 

 

DAL层:

 

 
  1. class DBUtil

  2. {

  3. public static string ConnString = @"Server= (Local);Database=Login;User ID=sa;Password=123";

  4. }

  5.  
  6. public class SocreDAO

  7. {

  8. public void UpdateScore(int ID,string userName,int value)

  9. {

  10. using (SqlConnection conn=new SqlConnection(DBUtil.ConnString ))

  11. {

  12. SqlCommand cmd = conn.CreateCommand();

  13. cmd.CommandText = @"INSERT INTO SCORES(UserName,Score) Values(@UserName,@Score)";

  14. cmd.Parameters.Add(new SqlParameter("@ID", ID));

  15. cmd.Parameters.Add(new SqlParameter ("@UserName",userName ));

  16. cmd.Parameters.Add(new SqlParameter("@Score", value ));

  17. conn.Open();

  18. //执行sql句,返回受影响行数

  19. cmd.ExecuteNonQuery();

  20.  
  21. }

  22.  
  23. }

  24. }

  25.  
  26.  
  27. public class UserDAO

  28. {

  29. public LoginModel.UserInfo SelectUser(string userName, string password)

  30. {

  31. using (SqlConnection conn = new SqlConnection(DBUtil.ConnString))//建立数据库连接

  32. {

  33. SqlCommand cmd = conn.CreateCommand(); // 创建命令

  34. // cmd.CommandText = @"SELECT ID,UserName,Password,Email FROM USERS WHERE UserName=@UserName AND Password=@Password "; //设置操作语句

  35. cmd.CommandType = CommandType.Text;

  36. cmd.Parameters.Add(new SqlParameter("@UserName", userName));

  37. cmd.Parameters.Add(new SqlParameter("@Password", password));

  38.  
  39. cmd.CommandText = @"SELECT ID,UserName,Password,Email FROM USERS WHERE UserName=@UserName AND Password=@Password "; //设置操作语句

  40.  
  41. conn.Open();//打开连接

  42. //创建数据读取对象,循环读取数据

  43. SqlDataReader reader = cmd.ExecuteReader(); //此方法用于用户进行的查询操作,使用SqlDataReader对象的Read();方法进行逐行读取。

  44.  
  45. LoginModel.UserInfo user = null;

  46. while (reader.Read())

  47. {

  48. if (user==null)

  49. {

  50. user = new LoginModel.UserInfo();

  51. }

  52. user.ID =reader.GetInt32(0); //获取指定列的32位有符号整数形式的值

  53. user.UserName = reader.GetString(1);

  54. user.Password = reader.GetString(2);

  55. if (!reader.IsDBNull (3))

  56. {

  57. user.Email = reader.GetString(3);

  58. }

  59. }

  60. return user;

  61. }

  62. }

  63. }

 

 

实体层:

 

 
  1. //数据模型,用于三层之间传输数据

  2. public class UserInfo

  3. {

  4. public int ID { get; set; }

  5. public string UserName { get; set; }

  6. public string Password { get; set; }

  7. public string Email { get; set; }

  8. }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值