asp.net三层架构

前几天在网上看了一篇有关设计模式的文章主要讲的是mvc设计模式的文章,觉得mvc真的叫经典。网上也有人写过类似的文章,个人觉得写的不好,我看了下逻辑乱的不得了,描述也是乱七八糟的,说是代理模式吧又不像,说是工厂设计模式吧他在代码里给你弄个什么反射。看到这样的代码我很想给这位大哥拍砖,这不就是所说的误人子弟吗。所以呢我自己花了一个小时写了个小例子给大家参考一下。下面就一步一步的来作下这个小例子。

1.ADO.NET需要使用到连接字符串,我们先把连接字符串配置到Web.config文件中,如下所示

<appSettings>
    <!-- 配置连接字符串 -->
		<add key="SQLConnString" value="Data Source=.\SQLEXPRESS;AttachDbFilename=G:\usemvc\mvc3层架构\usemvc\App_Data\student.mdf;Integrated Security=True;User Instance=True"/>
</appSettings>

2.给程序分层

(1)数据访问层

(2)控制器,如ashx

(3)视图层,例如aspx,html


3.开始开发数据访问层

(1)写一个类用来取出配置文件里配置的连接字符串

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace usemvc.Utility
{
    public class ConnectionInfo
    {
        //取得web.config里配置的连接字符串
        public static string getConnectionString() {
            //SQLConnString是配置文件里面配置的名称应该保持一致
            return ConfigurationSettings.AppSettings["SQLConnString"];
        }
    }
}

(2)编写用于处理crdu的类,这个类用来连接数据库

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
using usemvc.Utility;

namespace usemvc.SQLServerDAL
{
    public abstract class SqlHelper
    {
        public static readonly string CONN_STR = ConnectionInfo.getConnectionString();

      
        public static SqlDataReader ExecuteReader(string connString, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms)
        {
            SqlCommand cmd = new SqlCommand();
            SqlConnection conn = new SqlConnection(connString);

            // 我们在这里用 try/catch 是因为如果这个方法抛出异常,我们目的是关闭数据库连接,再抛出异常,
            // 因为这时不会有DataReader存在,此后commandBehaviour.CloseConnection将不会工作。
            try
            {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
                SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                cmd.Parameters.Clear();
                return rdr;
            }
            catch
            {
                conn.Close();
                throw;
            }
        }


        private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
        {

            if (conn.State != ConnectionState.Open)
                conn.Open();

            cmd.Connection = conn;
            cmd.CommandText = cmdText;

            if (trans != null)
                cmd.Transaction = trans;

            cmd.CommandType = cmdType;

            if (cmdParms != null)
            {
                foreach (SqlParameter parm in cmdParms)
                    cmd.Parameters.Add(parm);
            }
        }
    }
}
(3)编写pojo类

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace usemvc.Model
{
    public class StudentInfo
    {
        private int id;
        private String userName;

        public String UserName
        {
            get { return userName; }
            set { userName = value; }
        }
        private String password;

        public String Password
        {
            get { return password; }
            set { password = value; }
        }
      
        public int Id
        {
            get { return id; }
            set { id = value; }
        }

    }
}



(4) 开发处理业务逻辑的接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using usemvc.Model;

namespace usemvc.IDAL
{
    public interface IStudentDao
    {
        //通过ID取得用户信息
        StudentInfo getStudentInfoByID(int id);
        //判断数据库是否存在该用户
        int getUserCount(string username,string password);
    }
}

(5) 编写接口的实现类

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using usemvc.IDAL;
using usemvc.Model;
using System.Data.SqlClient;

namespace usemvc.SQLServerDAL
{
    public class StudentImpl:IStudentDao
    {
       
        //查询用户是否存在
        public int getUserCount(string username, string password) {

            int temp=0;
            string sql = "select count(username) from m_student where username=@username and password=@password";
            //创建一个参数
            SqlParameter[] parm = new SqlParameter[] { new SqlParameter("@username",username), new SqlParameter("@password",password) };
            
            using (SqlDataReader sdr = SqlHelper.ExecuteReader(SqlHelper.CONN_STR, CommandType.Text,sql, parm))
            {
                if (sdr.Read())
                {

                    temp = sdr.GetInt32(0);
                }
            }
            return temp;
        }
        public StudentInfo getStudentInfoByID(int id)
        {
           
              string PARM_ID = "@ID";
              string SQL_SELECT_CONTENT = "Select username,password From m_student Where id = @ID";
        //用户登录的处理

            //创意文章内容类
            StudentInfo stu = null;

            //创建一个参数
            SqlParameter parm = new SqlParameter(PARM_ID, SqlDbType.Int, 8);
            //赋上ID值
            parm.Value = id;

            using (SqlDataReader sdr = SqlHelper.ExecuteReader(SqlHelper.CONN_STR, CommandType.Text, SQL_SELECT_CONTENT, parm))
            {
                if (sdr.Read())
                {
                   
                    stu = new StudentInfo();
                    stu.Password = sdr.GetString(1);
                    stu.UserName = sdr.GetString(0);
                }
            }
            return stu;
        }

       
    }
}

(6) 编写一个代理操作类

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using usemvc.IDAL;
using usemvc.Model;
using usemvc.DALFactory;

namespace usemvc.SQLServerDAL
{
    public class StudentDaoProxy:IStudentDao
    {
        private IStudentDao dao;

        //构造方法实例化dao对象
        public StudentDaoProxy() {
            this.dao = new StudentImpl();
        }
        public StudentInfo getStudentInfoByID(int id) {
           //调用真实主题操作
            return this.dao.getStudentInfoByID(id);
            
        }
        public int getUserCount(string username,string password)
        {
            //调用真实主题操作
            return this.dao.getUserCount(username,password);

        }


       
    }
}

(7)编写工厂操作类

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Reflection;
using usemvc.SQLServerDAL;
using usemvc.IDAL;


namespace usemvc.DALFactory
{
    public class StudentDaoFactory
    {
       //取得Dao接口实例
        public static IStudentDao getIStudentDaoInstance() {
            //取得代理操作类StudentDaoProxy实例
            return new StudentDaoProxy();
        }
    }
}


4.开发控制器层,这里我用ashx来处理

using System;
using System.Collections;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
using System.Web.SessionState;
using usemvc.DALFactory;

namespace usemvc.ashx
{
    /// <summary>
    /// $codebehindclassname$ 的摘要说明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class CheckLogin : IHttpHandler, IRequiresSessionState
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";
          
            string username=context.Request["username"];
            string password= context.Request["password"];
           
             int temp=StudentDaoFactory.getIStudentDaoInstance().getUserCount(username,password);
             //下面是业务逻辑
             //如果数据库存在该用户
             if(temp==1){
                 //下面是程序的处理逻辑,我就不写了
                 //跳转或者数据处理
             }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

5.开发视图层(数据的显示)

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="login.aspx.cs" Inherits="usemvc.login" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript">
  $(document).ready(function(){
    $("#login").click(function(){
       var username=$("#username").val();
       var password=$("#password").val();
       $.ajax({
		type:"POST",
		url:"ashx/CheckLogin.ashx",
		data:"username="+username+"&password="+password,
		success:
			function()
			{
			 //这里只是一个简单的实例,在这里可以在ashx生成xml 在这里可以先解析再做判断
			 //之后处理自己的业务逻辑
			 window.location="Default.aspx"
			}
	  });

    });
  });
</script>
    <title>用户登录</title>
</head>
<body>
   用户名:<input type="text" id="username"/><br />
   密码:<input type="password" id="password"/><br />
   <input type="button" id="login" value="登录"/>
</body>
</html>

用户信息的显示页面

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using usemvc.SQLServerDAL;
using usemvc.Model;
using usemvc.DALFactory;

namespace usemvc
{
    public partial class _Default : System.Web.UI.Page
    {
        StudentInfo ci;
        protected void Page_Load(object sender, EventArgs e)
        {
              //protected System.Web.UI.WebControls.Label username;
             // protected System.Web.UI.WebControls.Label lblDataTime;
            this.GetContent(1);
            //this.GetCount();
        }
        private void GetCount() {
            int a = StudentDaoFactory.getIStudentDaoInstance().getUserCount("chenruiyin","123456");
            this.Response.Write(a);
        }
         private void GetContent(int id)
        {
         
            ci = StudentDaoFactory.getIStudentDaoInstance().getStudentInfoByID(1);
            this.Response.Write("<table border='1' width='500' id='tab'>");
            this.Response.Write("<tr>");
            this.Response.Write("<td>"+"用户名"+"</td>");
            this.Response.Write("<td>" + "密码" + "</td>");
            this.Response.Write("</tr>");
            this.Response.Write("<tr>");
            if (ci != null)
            {
                 this.Response.Write("<td>"+ci.UserName+"</td>");
                 this.Response.Write("<td>" + ci.Password + "</td>");  
                //username.Text = ci.UserName;
            }
            this.Response.Write("<tr>");
            this.Response.Write("</table>");

            
        }
}
   
}

到这里开发就结束了,代码比较简单,只写了个SqlDataReader,ExecutenoneQuery类型的操作和js校验我没加上,大家自己加上好了。代码我会上传到资源里大家自己去下载啊。


你可能感兴趣的:(asp.net三层架构)