[原创] Asp.Net三层体系结构应用实例(2)源代码
作者:C/S框架网  发布日期:2011/07/16 00:16:48
  [原创] Asp.Net三层体系结构应用实例(2)源代码

[原创] Asp.Net三层体系结构应用实例(2)源代码


代码实现:
TUser.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace Models
{
    /*
    实体类仅定义数据模型,该模型应与数据表对应,属性定义与数据表的字段名一致。
    网上有很多3层架构生成工具,实体类生成工具.如大数据表,大量数据表需要建立实体类时,建议使用
    实体类生成工具。手工输入是极费时的苦差事。
    */    
   /// <summary>
   /// 用户模型,实体类.
   /// </summary>
   public class TUser
   {
      private int _isid = 0;
      private string _userName;
      private string _userID;
      private string _password;
      
      public int isid { get { return _isid; } set { _isid = value; } }
      public string UserID { get { return _userID; } set { _userID = value; } }
      public string UserName { get { return _userName; } set { _userName = value; } }
      public string Password { get { return _password; } set { _password = value; } }
   }
}

dalUser.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using Models;

namespace DataAccessLayer
{
   /*****************************************************************
   * 3层结构执行顺序:1.WebUI->2.BLL->3.DAL->OleDB->4.SQL SERVER/ACCESS
   *
   * 数据访问层(dal)顾名思义该层是与数据库交互的层级。如获取数据,更新数据,插入记录等等。
   * 它的上一级是业务逻辑层.业务逻辑层需要操作某数据时,调用数据访问层的接口,数据访问层操作
   * OleDb接口访问Access数据库,最后返回数据。
   *
   * *** 注意***
   *
   * 为了方便演示,这里面所有Sql语句都是拼接而成,这种方式极不安全,为黑客注入js脚本提供便利。
   * 最好改成传参数的方式。关于如何防范SQL注入,不是本程序涵盖内容。
   *
   * by www.csframework.com - C/S框架网
   *****************************************************************/

   /// <summary>
   /// 用户的数据存取层
   /// </summary>
   public class dalUser
   {
      private static dalUser _Instance = null;
      public static dalUser Instance
      {
         get
         {
            if (_Instance == null) _Instance = new dalUser();
            return _Instance;
         }
      }
      
      /// <summary>
      /// 获取所有用户列表
      /// </summary>
      /// <returns></returns>
      public DataTable GetUsers()
      {
         string sql = "select * from [t_User]";
         return DataProvider.Instance.GetTable(sql, "t_User");
      }
      
      /// <summary>
      /// 新增用户
      /// </summary>
      /// <param name="user">用户对象</param>
      /// <returns></returns>
      public bool AddUser(TUser user)
      {
         //往数据库写入记录
         string sql = "insert into [t_User]([UserID],[UserName],[Password]) values (''''{0}'''',''''{1}'''',''''{2}'''') ";
         sql = string.Format(sql, user.UserID, user.UserName, user.Password);
         int i = DataProvider.Instance.ExecNoQuery(sql);
         return i > 0;
      }
      
      /// <summary>
      /// 用户登录
      /// </summary>
      /// <param name="userID">登录帐号</param>
      /// <returns></returns>
      public bool Login(string userID, string password)
      {
         string sql = "select count(*) from [t_User] where [UserID]=''''" + userID + "'''' and [Password]=''''" + password + "''''";
         object o = DataProvider.Instance.ExecScalar(sql);
         return int.Parse(o.ToString()) > 0;
      }
      
      /// <summary>
      /// 检查用户是否存在
      /// </summary>
      /// <param name="userid">用户编号</param>
      /// <returns></returns>
      public bool ExistsUser(string userid)
      {
         string sql = "select count(*) from [t_User] where [UserID]=''''" + userid + "''''";
         object o = DataProvider.Instance.ExecScalar(sql);
         return int.Parse(o.ToString()) > 0;
      }
      
   }
}

DataProvider.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OleDb;

namespace DataAccessLayer
{
   /// <summary>
   /// 数据提供者.
   /// </summary>
   public class DataProvider
   {
      
      private static DataProvider _Instance = null;
      /// <summary>
      /// 数据提供者对象实例,因程序频繁请求数据,减少创建对象的次数。
      /// </summary>
      public static DataProvider Instance
      {
         get
         {
            if (_Instance == null)
            {
               _Instance = new DataProvider();
            }
            
            return _Instance;
         }
      }
      
      private string _dbPath = "";
      
      /// <summary>
      /// Access数据库路径
      /// </summary>
      public string DBPath { get { return _dbPath; } set { _dbPath = value; } }
      
      /// <summary>
      /// 提供数据表
      /// </summary>
      /// <param name="sql">SQL 查询语句</param>
      /// <param name="tableName">数据表名</param>
      /// <returns></returns>
      public DataTable GetTable(string sql, string tableName)
      {
         OleDbConnection conn = this.CreateConnection();
         OleDbCommand cmd = new OleDbCommand(sql, conn);
         OleDbDataAdapter adp = new OleDbDataAdapter(cmd);
         
         DataTable dt = new DataTable(tableName);
         adp.Fill(dt);
         
         conn.Close();
         conn.Dispose();
         return dt;
      }
      
      /// <summary>
      /// 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。
      /// </summary>
      /// <param name="sql"></param>
      /// <returns></returns>
      public object ExecScalar(string sql)
      {
         OleDbConnection conn = this.CreateConnection();
         OleDbCommand cmd = new OleDbCommand(sql, conn);
         object o = cmd.ExecuteScalar();
         conn.Close();
         conn.Dispose();
         return o;
      }
      
      /// <summary>
      /// 针对 System.Data.OleDb.OleDbCommand.Connection 执行 SQL 语句并返回受影响的行数。
      /// </summary>
      /// <param name="sql"></param>
      /// <returns></returns>
      public int ExecNoQuery(string sql)
      {
         OleDbConnection conn = this.CreateConnection();
         OleDbCommand cmd = new OleDbCommand(sql, conn);
         int ret = cmd.ExecuteNonQuery();
         conn.Close();
         conn.Dispose();
         return ret;
      }
      
      /// <summary>
      /// 创建一个OleDbConnection连接.
      /// </summary>
      /// <returns></returns>
      private System.Data.OleDb.OleDbConnection CreateConnection()
      {
         string connStr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DBPath;
         OleDbConnection conn = new OleDbConnection(connStr);
         if (conn.State != ConnectionState.Connecting) conn.Open();
         return conn;
      }
   }
}


bllUser.cs
using System;
using System.Collections.Generic;
using System.Text;
using Models;
using DataAccessLayer;
using BusinessLogicLayer.Roles;
using System.Data;

namespace BusinessLogicLayer
{
   /// <summary>
   /// 用户的业务逻辑层
   /// </summary>
   public class bllUser
   {
      /// <summary>
      /// 新增用户
      /// </summary>
      /// <param name="user">用户对象</param>
      /// <returns></returns>
      public bool AddUser(TUser user)
      {
         //向数据库写入数据之前,检查数据的合法性。比如SQL注入,暴力注入等业务操作。
         //如果数据是合法的,可以写入数据了。这种逻辑性操作,是不是属于业务逻辑的范畴呢?
         UserRole.Validate(user);
         
         return dalUser.Instance.AddUser(user);
      }
      
      public bool Login(string userID, string password)
      {
         //检查登录信息
         UserRole.ValidateLogin(userID, password);
         
         //调用数据访问层的接口检查用户登录
         return dalUser.Instance.Login(userID, password);
      }
      
      public DataTable GetUsers()
      {
         return dalUser.Instance.GetUsers();
      }
   }
}

UserRole.cs
using System;
using System.Collections.Generic;
using System.Text;
using Models;
using DataAccessLayer;

namespace BusinessLogicLayer.Roles
{
   /// <summary>
   /// 用户规则。检查数据合法性。
   /// </summary>
   public class UserRole
   {
      public static void Validate(TUser user)
      {
         if (dalUser.Instance.ExistsUser(user.UserID))
         throw new Exception("用户已经存在!");
      }
      
      public static void ValidateLogin(string userID, string password)
      {
         if (userID.Trim() == "")
         throw new Exception("用户编号不正确或不能为空!");
         
         if (password.Trim() == "")
         throw new Exception("密码不正确或不能为空!");
      }
   }
}

Msg.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/// <summary>
/// Summary description for Msg
/// </summary>
public class Msg
{
   public static void Show(Page curPage, string msg)
   {
      curPage.ClientScript.RegisterStartupScript(curPage.GetType(),
      "msg", "<script>alert(''''" + msg + "'''');</script>");
   }
}

项目下载:



C/S框架网|原创精神.创造价值.打造精品


扫一扫加作者微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务

点击下载附件 点击下载附件 (如下载失败,请邮件通知我们寄回给您,或QQ:23404761留言.)
上一篇 下一篇