ASP.NET动态网站制作(27)-- 三层框架(1)

前言:今天主要介绍一下三层框架,给大家一个整体的概念。分层概念使得程序低耦合,更加健壮,扩展性更好。

内容

  1.三层:

  UI(表现层):主要是指用户交互的界面。用于接收用户输入的数据和显示处理后用户需要的数据。 

  BLL(业务逻辑层):UI层和DAL层之间的桥梁实现业务逻辑。业务逻辑具体包含:验证、计算、业务规则等等。

  DAL(数据访问层):与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。(当然这些操作都是基于UI层的。用户的需求反映给界面(UI),UI反映给BLLBLL反映给DALDAL进行数据的操作,操作后再一一返回,直到将用户所需数据反馈给用户)

  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             }

  项目中常用这种方式。

后记:多练习,多实践。

posted @ 2015-11-14 18:53  Zoe_yan  阅读(975)  评论(0编辑  收藏  举报