zoukankan      html  css  js  c++  java
  • 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             }

      项目中常用这种方式。

    后记:多练习,多实践。

  • 相关阅读:
    HCIA_R&S-学习_Day05(PPPoE、DHCP、ACL、NAT)
    HCIA_R&S-学习_Day04(链路状态协议OSPF & PPP)
    HCIA_R&S-学习_Day03(路由协议基础与实现)
    【详谈 Delta Lake 】系列技术专题 之 湖仓一体( Lakehouse )
    工作7年,我的10条经验总结
    Hologres揭秘:优化COPY,批量导入性能提升5倍+
    谈谈JVM内部锁升级过程
    如何帮用户管好云账本?阿里云数据库助力收钱吧 | 甲子光年
    重磅 | 数据库自治服务DAS论文入选全球顶会SIGMOD,领航“数据库自动驾驶”新时代
    同程旅行基于 RocketMQ 高可用架构实践
  • 原文地址:https://www.cnblogs.com/zoe-yan/p/4950230.html
Copyright © 2011-2022 走看看