前言:今天主要介绍一下三层框架,给大家一个整体的概念。分层概念使得程序低耦合,更加健壮,扩展性更好。
内容:
1.三层:
UI(表现层):主要是指与用户交互的界面。用于接收用户输入的数据和显示处理后用户需要的数据。
BLL(业务逻辑层):UI层和DAL层之间的桥梁。实现业务逻辑。业务逻辑具体包含:验证、计算、业务规则等等。
DAL(数据访问层):与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。(当然这些操作都是基于UI层的。用户的需求反映给界面(UI),UI反映给BLL,BLL反映给DAL,DAL进行数据的操作,操作后再一一返回,直到将用户所需数据反馈给用户)
2.老师推荐他之前用的一个框架。老师的三层指:视图层--web,控制层(业务逻辑层)--dal,实体层--model。
3.新建model文件夹和dal文件夹,并向里面添加响应的项目文件(包括model.base,dal.base,utility),并分别向两个文件夹中添加新建的类库文件(model.zoe,dal.zoe)。在model.zoe里面的每一个类在数据库里面就对应一个表,类里面的每一个字段对应的就是表里面的每一个字段。
4..NET版本向下兼容,需要看一下服务器支持的.NET版本。我买的服务器支持.NET4.0,在生成DLL时应该改一下相应的.NET版本。
5.具体的操作过程:需要新建一个Reference文件夹,里面专门存放个程序集生成的dll文件。
model(model.base--生成,model.zoe--生成需要引入model.base.dll);
dal(Utility--生成,dal.base--生成需要引入model.base.dll和utility.dll);dal.zoe(生成需要引入model.base.dll和utility.dll和model.zoe.dll);
WEB程序里需要引入model.base.dll,model.zoe.dll,utility.dll,dal.base.dll,dal.zoe.dll。
6.上面的model文件与数据库对应,model.zoe里面的每一个类就对应数据库里面的一个表,类里面的每一个字段对应表里的每一个字段。dal.zoe里面包含所有的和数据库交互的业务逻辑代码(增删改查)。WEB里面就是呈现给用户的界面代码,web部分不应该包含业务逻辑代码和数据库操作的代码。
7.框架是通过向model.base下面的Enums.cs文件中的DataBaseEnum中添加数据库名称而获得数据库信息的,如sql_zoe=2。每一个类库文件被改变之后一定要重新生成。
8.动软代码生成器。
9.一个对象就是数据库中的一条记录,通过实例化表,将其存在内存中,通过ADO.NET来调用数据库中的数据。UserInfor user = new UserInfor(); user.UserName...。
10.在model.zoe中添加UserInfor.cs,对应于UserInfor表,并添加各字段。
11.在dal.zoe中添加UserInforDAL.cs,表示对UserInfor表进行增删改查。
1 public static BaseDAL<UserInfor> m_UserInforDal = new BaseDAL<UserInfor>();
上面是一个泛型形式的对象,并且是静态的,说明我们可以通过类来调用所有的增删改查的方法。框架中的所有增删改查方法都位于BaseDAL.cs中。是整个框架中最核心的部分。
12.调用数据库处理方法:
1 //GetModel()的两种用法 2 UserInfor user = UserInforDal.GetModel(18);//18表示UserId=18 3 4 //防SQL注入的方法 5 List<dbParam> listPm = new List<dbParam>(); 6 listPm.Add({ 7 ParamName="@UserName", 8 ParamDbType = DbType.String, 9 ParamValue = username 10 }); 11 listPm.Add({ 12 ParamName="@Pwd", 13 ParamDbType = DbType.String, 14 ParamValue = pwd 15 }); 16 UserInfor user = UserInforDal.GetModel("UserName=@UserName and Pwd=@Pwd",listPm);
13.除了上面的防SQL注入方法,还有另外一种方法:WebSafe.cs文件(在Utility文件夹中):
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace com.Utility 7 { 8 public class WebSafe 9 { 10 public static bool SqlInsert(string strS) 11 { 12 bool b = true; 13 string sql = "exec |insert |select |delete |update |count |chr |mid |master |truncate |char |declare |drop |creat "; 14 string[] sql_c = sql.Split('|'); 15 foreach (var sl in sql_c) 16 { 17 if (strS.ToLower().IndexOf(sl) >= 0) 18 { 19 b = false; 20 break; 21 } 22 } 23 return b; 24 } 25 } 26 }
Login.aspx.cs:
1 string username = txtUserName.Text.Trim(); 2 string pwd = txtPwd.Text.Trim(); 3 if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(pwd)) 4 { 5 Response.Write("<script>alert('用户名或者密码不能为空');</script>"); 6 } 7 else 8 { 9 try 10 { 11 if (WebSafe.SqlInsert(username) == false || WebSafe.SqlInsert(pwd) == false) 12 { 13 Response.Write("<script>alert('内容包含不安全因素');</script>"); 14 } 15 else 16 { 17 UserInfor user = UserInforDAL.m_UserInforDal.GetModel(string.Format("UserName='{0}' and Pwd='{1}'", username, pwd)); 18 if (user == null) 19 { 20 Response.Write("<script>alert('用户名或者密码错误');</script>"); 21 } 22 else 23 { 24 if (chk.Checked) 25 { 26 Response.Cookies["username"].Expires = DateTime.Now.AddHours(1); 27 } 28 Response.Cookies["username"].Value = username; 29 Response.Redirect("RNewsM.aspx"); 30 } 31 } 32 } 33 catch 34 { 35 Response.Write("网页正在维修中...."); 36 } 37 }
项目中常用这种方式。
后记:多练习,多实践。