三层架构 C# 实现篇
1、三层UML图的简单理解:
很惭愧,三层架构,这次再回来看你了,好好的重新做一个详细小结:
2、再回顾这些问题:
1,什么是三层?
2,为什么使用三层?
3,三层与以往使用的两层相比有什么不同?它的优势在哪里?
4、什么是 七层,怎么又有七层?
5,如何学好三层?如何应用三层?
……
UI(User Interface):主要是指与用户交互的界面。用于接收用户输入的数据和显示 处理后用户需要的数据。
BLL:(Business Logic layer):UI层和DAL层之间的桥梁。实现业务逻辑。业务逻辑
具体包含:验证、计算、业务规则等等。
DAL:(Data Access Layer):与数据库打交道。主要实现对数据的增、删、改、查。
将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。(当
然这些操作都是基于UI层的。用户的需求反映给界面(UI),UI反映给BLL,BLL反映给
DAL,DAL进行数据的操作,操作后再一一返回,直到将用户所需数据反馈给用户)
对比如汽车制造:
IU (表示层)就是上面我们看到的一部已经造好的霸气的Car,这是怎么来的呢,
有汽车制造厂的员工,就类似于BAL(业务逻辑层)进行汽车的逻辑组装,但这一切都必
要有相应的汽车原件,在计算机中中我们称之为数据源,所以就有了DLL(数据访问
层)。一些看时繁琐复杂问题,有了三层,理解起来就简单了,三层架构是伟大的前人
总结出的一种为了实现程序的可扩展性,可复用性,可读性,可维护性以及方便合作开
发等而总结出的一种架构。其实三层架构是面向对象发展的必然结果。为了实现上述的
几种特点,分层是必然的。
3、具体实践步骤篇:
1)、首先要做的就是创建数据库:
表一; dbo.Scores:
表二:dbo.Users
2)、打开VS2012软件,新建一个类库LoginSolution,命名为LoginDAL,具体如下
图:可以添加,也可新创建一个:
同理创建LogBAL、LogDLL和LogModel项目列报如下:
有了的这些前期的基础准备工作就可以进行具体的代码实现了,这可以有C#和VB.NET
分别实现下面我们进行C#实践篇:
LoginBAL层,LoginManager.cs
<span style="font-size:14px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Login.BLL
{
public class LoginManager
{
//登录验证
public Login.Model.UserInfo UserLogin(string userName, string password)
{
//throw new NotImplementedException();
//访问数据源,需要访问数据源,所以实例化一个D层UserDAO对象
Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();
Login.Model.UserInfo user= uDao.SelectUser(userName ,password );
if (user != null) //登录成功!
{
//Login.DAL.ScoreDAO sDao=new Login.DAL.ScoreDAO();
//sDao.UpdateScore(userName,10);
Console.WriteLine("OK");
return user;
}
else
{
throw new Exception("登录失败");
}
return user;
}
}
</span>
LoginDAL层:
1、Dbutil.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Login.DAL
{
class DbUtil
{
public static string ConnString = @"Server=(local);DataBase=login;User ID=sa;Password=1";
//DataBase=结数据库中表的文件,login; User ID =数据库中的登入用户名; password=数据库用户的登录密码
}
}
2、Score.DAO.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Login.DAL
{
public class ScoreDAO
{
public void UpdateScore(string userName, int value)
{
throw new NotFiniteNumberException();
}
}
}
3、User.DAO.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace Login.DAL
{
public class UserDAO
{
public Login.Model.UserInfo SelectUser(string userName, string password)
{
//有using可以是connection自动的关闭
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
{
SqlCommand cmd = conn.CreateCommand();
//sql的文本
cmd.CommandText = @"Select ID,UserName,Password,Email From Users Where UserName=@UserName and Password=@Password ";
//设置两个参数
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;
}
}
}
}
LoginModel层;
// 主要为业务逻辑服务 ,封装数据访问,独立于其他三个层次的
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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; }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace LoginUI
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
小结:
本来专业课就不少,基础没有夯实,下面的机房系统走不下去,回来再巩固小结一
下。师傅跟我过:不怕慢,就怕停!不怕难,就怕浮!基础务实了,后面才好走;地基
打实了,建高层才可能。当然,合理的安排好时间管理,进度也要有的。
三层架构,是一个从整个应用程序架构的角度来分的三层(如果程序需要,也可以
分多层)。三层是为了解决整个应用程序中各个业务操作过程中不同阶段的代码封装的
问题,为了使程序员更加专注的处理某阶段的业务逻辑。比如将数据库操作代码封装到
一层中,提供一些方法根据参数直接返回用户需要的相应数据,这样在处理具体的业务
逻辑的时候,就不用关心数据的存储问题了。