asp.net网站三层架构详解和反射知识

项目文件架构

实现步骤为:4-3-6-5-2-1
ID
项目
描述
用途

项目引用关系

实例所需文件

相关方法

1

Web

表现层

Web页和控件

引用BLL

WebUI.aspx

WebUI.aspx.cs

GetContent()

2

BLL

业务逻辑层

业务逻辑组件

引用 IDAL,Model,使用DALFactory创建实例

Content.cs

ContentInfo GetContentInfo(int id)

3

IDAL

数据访问层接口定义

每个DAL实现都要实现的一组接口

引用 Model

IContent.cs

ContentInfo GetContentInfo(int id)

4

Model

业务实体

传递各种数据的容器

无引用

ContentInfo.cs

5、DALFactory

数据层的抽象工厂

创建反射,用来确定加载哪一个数据库访问程序集的类

引用IDAL,通过读取web.config里设置的程序集,加载类的实例,返回给BLL使用。

Content.cs

IDAL.Icontent create()

6、SQLServerDAL

SQLServer数据访问层

Microsoft SQL Server特定的Pet Shop DAL实现,使用了IDAL接口

引用 Model和IDAL,被DALFactory加载的程序集,实现接口里的方法。

SqlHelper.cs

Content.cs

SqlDataReader ExecuteReader()

PrepareCommand()

ContentInfo GetContentInfo(int id)

OracleDAL

Oracle数据访问层

7、DBUtility

数据库访问组件基础类

GetSqlServerConnectionString得到数据库连接字符串,也可省去该项目,在SQLServerDAL.SqlHelper中用static readonly string SqlConnectionString代替。

无引用

实现步骤过程

1、创建Model,实现业务实体。

2、创建IDAL,实现接口。

3、创建SQLServerDAL,实现接口里的方法。

4、增加web.config里的配置信息,为SQLServerDAL的程序集。

5、创建DALFactory,返回程序集的指定类的实例。

6、创建BLL,调用DALFactory,得到程序集指定类的实例,完成数据操作方法。

7、创建WEB,调用BLL里的数据操作方法。

注意:

1、web.config里的程序集名称必须与SQLServerDAL里的输出程序集名称一致。

2、DALFactory里只需要一个DataAccess类,可以完成创建所有的程序集实例。

3、项目创建后,注意修改各项目的默认命名空间和程序集名称。

4、注意修改解决方案里的项目依赖。

5、注意在解决方案里增加各项目引用。

三、各间的访问过程

1、传入值,将值进行类型转换(为整型)。

2、创建BLL层的content.cs对象c,通过对象c访问BLL层的方法GetContentInfo(ID)调用BLL层。

3、BLL层方法GetContentInfo(ID)中取得数据访问层SQLServerDAL的实例,实例化IDAL层的接口对象dal,这个对象是由工厂层DALFactory创建的,然后返回IDAL层传入值所查找的内容的方法dal.GetContentInfo(id)。

4、数据工厂通过web.config配置文件中给定的webdal字串访问SQLServerDAL层,返回一个完整的调用SQLServerDAL层的路径给 BLL层。

5、到此要调用SQLServerDAL层,SQLServerDAL层完成赋值Model层的对象值为空,给定一个参数,调用SQLServerDAL层的SqlHelper的ExecuteReader方法,读出每个字段的数据赋值给以定义为空的Model层的对象。

6、SqlHelper执行sql命令,返回一个指定连接的数据库记录集,在这里需要引用参数类型,提供为打开连接命令执行做好准备PrepareCommand。

7、返回Model层把查询得到的一行记录值赋值给SQLServerDAL层的引入的Model层的对象ci,然后把这个对象返回给BLL。

8、回到Web层的BLL层的方法调用,把得到的对象值赋值给Lable标签,在前台显示给界面

四、项目中的文件清单

1、DBUtility项目

(1)connectionInfo.cs

using System;
using System.Configuration;
namespace Utility
{
/// <summary>
/// ConnectionInfo 的摘要说明。
/// </summary>
public class ConnectionInfo
{
public static string GetSqlServerConnectionString()
{
return ConfigurationSettings.AppSettings["SQLConnString"];
}
}
}

2、SQLServerDAL项目
(1)SqlHelper.cs抽象类
using System;
using System.Data;
using System.Data.SqlClient;
using DBUtility;

namespace SQLServerDAL
{
/// SqlHelper 的摘要说明。
public abstract class SqlHelper
{
public static readonly string CONN_STR = ConnectionInfo.GetSqlServerConnectionString();
/// 用提供的函数,执行SQL命令,返回一个从指定连接的数据库记录集
/// 例如:
/// SqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));

/// </remarks>

/// <param name="connectionString">SqlConnection有效的SQL连接字符串</param>

/// <param name="commandType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>

/// <param name="commandText">SQL语句或存储过程</param>

/// <param name="commandParameters">SqlParameter[]参数数组</param>

/// <returns>SqlDataReader:执行结果的记录集</returns>

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;

}

}

/// <summary>

/// 为执行命令做好准备:打开数据库连接,命令语句,设置命令类型(SQL语句或存储过程),函数语取。

/// </summary>

/// <param name="cmd">SqlCommand 组件</param>

/// <param name="conn">SqlConnection 组件</param>

/// <param name="trans">SqlTransaction 组件,可以为null</param>

/// <param name="cmdType">语句类型:CommandType.Text、CommandType.StoredProcedure</param>

/// <param name="cmdText">SQL语句,可以为存储过程</param>

/// <param name="cmdParms">SQL参数数组</param>

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);

}

}

}

}

(2)Content.cs类
using System;
using System.Data;
using System.Data.SqlClient;
using Model;
using IDAL;

namespace SQLServerDAL
{
/// <summary>

/// Content 的摘要说明。

/// </summary>

public class Content:IContent

{

private const string PARM_ID = "@ID";

private const string SQL_SELECT_CONTENT = "Select ID, Title, Content, AddDate, CategoryID From newsContent Where ID = @ID";

public ContentInfo GetContentInfo(int id)

{

//创意文章内容类

ContentInfo ci = null;

//创建一个参数

SqlParameter parm = new SqlParameter(PARM_ID, SqlDbType.BigInt, 8);

//赋上ID值

parm.Value = id;

using(SqlDataReader sdr = SqlHelper.ExecuteReader(SqlHelper.CONN_STR, CommandType.Text, SQL_SELECT_CONTENT, parm))

{

if(sdr.Read())

{

ci = new ContentInfo(sdr.GetInt32(0),sdr.GetString(1), sdr.GetString(2),

sdr.GetDateTime(3), sdr.GetInt32(4), sdr.GetInt32(5), sdr.GetString(6));

}

}

return ci;

}

}

}

3、Model项目

(1)contentInfo.cs

using System;

namespace Model

{

/// <summary>

/// Class1 的摘要说明。

/// </summary>

public class ContentInfo

{

private int _ID;

private string _Content;

private string _Title;

private string _From;

private DateTime _AddDate;

private int _clsID;

private int _tmpID;

/// <summary>

/// 文章内容构造函数

/// </summary>

/// <param name="id">文章流水号ID</param>

/// <param name="content">文章内容</param>

/// <param name="title">文章标题</param>

/// <param name="from">文章来源</param>

/// <param name="clsid">文章的分类属性ID</param>

/// <param name="tmpid">文章的模板属性ID</param>

public ContentInfo(int id,string title,string content,string from,DateTime addDate,int clsid,int tmpid )

{

this._ID = id;

this._Content = content;

this._Title = title;

this._From = from;

this._AddDate = addDate;

this._clsID = clsid;

this._tmpID = tmpid;

}

//属性

public int ID

{

get { return _ID; }

}

public string Content

{

get { return _Content; }

}

public string Title

{

get { return _Title; }

}

public string From

{

get { return _From; }

}

public DateTime AddDate

{

get { return _AddDate; }

}

public int ClsID

{

get { return _clsID; }

}

public int TmpID

{

get { return _tmpID; }

}

}

}

4、IDAL项目

(1)Icontent.cs

using System;

using Model;

namespace IDAL

{

/// <summary>

/// 文章内容操作接口

/// </summary>

public interface IContent

{

/// <summary>

/// 取得文章的内容。

/// </summary>

/// <param name="id">文章的ID</param>

/// <returns></returns>

ContentInfo GetContentInfo(int id);

}

}

5、DALFactory项目

(1)Content.cs

using System;

using System.Reflection;

using System.Configuration;

using IDAL;

namespace DALFactory

{

/// <summary>

/// 工产模式实现文章接口。

/// </summary>

public class Content

{

public static IDAL.IContent Create()

{

// 这里可以查看 DAL 接口类。

string path = System.Configuration.ConfigurationSettings.AppSettings["WebDAL"].ToString();

string className = path+".Content";

// 用配置文件指定的类组合

return (IDAL.IContent)Assembly.Load(path).CreateInstance(className);

}

}

}

6、BLL项目

(1)Content.cs

using System;

using Model;

using IDAL;

namespace BLL

{

/// <summary>

/// Content 的摘要说明。

/// </summary>

public class Content

{

public ContentInfo GetContentInfo(int id)

{

// 取得从数据访问层取得一个文章内容实例

IContent dal = DALFactory.Content.Create();

// 用DAL查找文章内容

return dal.GetContentInfo(id);

}

}

}

7、Web项目

1、Web.config:

<appSettings>

<add key="SQLConnString" value="Data Source=localhost;Persist Security info=True;Initial Catalog=newsDB;User ID=sa;Password= " />

<add key="WebDAL" value="SQLServerDAL" />

</appSettings>

2、WebUI.aspx

<%@ Page language="c#" Codebehind="WebUI.aspx.cs" AutoEventWireup="false" Inherits="Web.WebUI" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >

<HTML>

<HEAD>

<title>WebUI</title>

<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">

<meta name="CODE_LANGUAGE" Content="C#">

<meta name="vs_defaultClientScript" content="JavaScript">

<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">

</HEAD>

<body MS_POSITIONING="GridLayout">

<form id="Form1" method="post" runat="server">

<FONT">宋体"></FONT>

<table width="600" border="1">

<tr>

<td style="WIDTH: 173px">&nbsp;</td>

<td>&nbsp;

<asp:Label id="lblTitle" runat="server"></asp:Label></td>

</tr>

<tr>

<td style="WIDTH: 173px; HEIGHT: 22px">&nbsp;</td>

<td style="HEIGHT: 22px">&nbsp;

<asp:Label id="lblDataTime" runat="server"></asp:Label></td>

</tr>

<tr>

<td style="WIDTH: 173px">&nbsp;</td>

<td>&nbsp;

<asp:Label id="lblContent" runat="server"></asp:Label></td>

</tr>

<tr>

<td style="WIDTH: 173px">&nbsp;</td>

<td>&nbsp;</td>

</tr>

<tr>

<td style="WIDTH: 173px; HEIGHT: 23px">&nbsp;</td>

<td style="HEIGHT: 23px">&nbsp;</td>

</tr>

<tr>

<td style="WIDTH: 173px">&nbsp;</td>

<td>&nbsp;</td>

</tr>

<tr>

<td style="WIDTH: 173px">&nbsp;</td>

<td>&nbsp;</td>

</tr>

<tr>

<td style="WIDTH: 173px">&nbsp;</td>

<td>&nbsp;</td>

</tr>

<tr>

<td style="WIDTH: 173px">&nbsp;</td>

<td>&nbsp;

<asp:Label id="lblMsg" runat="server">Label</asp:Label></td>

</tr>

</table>

</form>

</body>

</HTML>

时间: 2024-10-20 09:58:16

asp.net网站三层架构详解和反射知识的相关文章

Java Web 三层架构详解

java 三层架构ssh 一个spring2.5+hibernate3.2+struts2.0组合框架,使用spring的 IoC来管理应用的 所有bean,包括struts2的 action,充分发挥了spring轻量级框架的 优势.  摘 要: 针对当前Web应用程序开发面临的问题,结合目前比较流行的开源框架Spring.Struts和hibernate,提出了一种开发J2EE Web应用的轻量级解决方案,以帮助开发人员在短期内搭建结构清晰.可复用性好.维护方便的Web应用程序.并且,通过案

asp.net三层架构详解

一.数据库 /*==============================================================*/ /* DBMS name:      Microsoft SQL Server 2000                    */ /*==============================================================*/ if exists (select 1 from sysobjects where i

高并发高流量网站架构详解

(推荐)高并发高流量网站架构详解 Web2.0的兴起,掀起了互联网新一轮的网络创业大潮.以用户为导 向的新网站建设概念,细分了网站功能和用户群,不仅成功的造就了一大批新生的网站,也极大的方便了上网的人们.但Web2.0以用户为导向的理念,使得新 生的网站有了新的特点--高并发,高流量,数据量大,逻辑复杂等,对网站建设也提出了新的要求. 本文围绕高并发高流量的网站架构设计问题,主要研究讨论了以下内容: 首先在整个网络的高度讨论了使用镜像网站,CDN内容分发网络等技术对负载均衡带来的便利及各自的优缺

NopCommerce源码架构详解--初识高性能的开源商城系统cms

很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从中学习很多企业系统.软件开发的规范和一些新的技术.技巧,可以快速地提高我们的技术能力.所以我最近决定写一个“NopCommerce源码架构详解”的系列,来详细剖析NopCommerce的架构和原理. Nopcommerce主要用到的技术及特点: 1.Entity Framework 2.ASP.NET mvc 3.IoC容器+依赖注入(Autofac) 4.使用EF中的E

NopCommerce源码架构详解

NopCommerce源码架构详解--初识高性能的开源商城系统cms 很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从中学习很多企业系统.软件开发的规范和一些新的技术.技巧,可以快速地提高我们的技术能力.所以我最近决定写一个“NopCommerce源码架构详解”的系列,来详细剖析NopCommerce的架构和原理. Nopcommerce主要用到的技术及特点: 1.Entity Framework 2.ASP.NET 

Nop--NopCommerce源码架构详解专题目录

最近在研究外国优秀的ASP.NET mvc电子商务网站系统NopCommerce源码架构.这个系统无论是代码组织结构.思想及分层都值得我们学习.对于没有一定开发经验的人要完全搞懂这个源码还是有一定的难度的,所以也打算写一个跟蓝狐学习Nop--NopCommerce源码架构详解系列文章. 以下文章主要针对NopCommerce版本:Nop3.4 NopCommerce源码架构详解--初识高性能的开源商城系统cms NopCommerce源码架构详解--Autofac依赖注入分析 NopCommer

支撑5亿用户、1.5亿活跃用户的Twitter最新架构详解及相关实现

如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 摘要:Twitter出道之初只是个奋斗在RoR上的小站点,而如今已拥有1.5亿的活跃用户,系统日传输tweet更多达4亿条,并已完成了以服务为核心的系统架构蜕变. Twitter如今在世界范围内已拥有1.5亿的活跃用户,为了给用户生成timeline(时间轴)需支撑30万QPS,其firehose每秒同样生成22MB数据.整个系统每天传输tweet 4亿条,并且只需要5分钟就可以让一条twe

asp.net的sessionState节点详解

web.config关于sessionState节点的配置方案,sessionState有四种模式:off,inProc,StateServer,SqlServer. 1.off模式 从字面上就可以看出这个是关闭模式,如果当前页面不需要session的值,为了减少服务器资源,你可以去掉Session的开销. <sessionState mode="off">或者页面上 <%@ Page EnableSessionState="false" %>

领域驱动设计(Domain Driven Design)参考架构详解

转自:http://blog.csdn.net/bluishglc/article/details/6681253 领域驱动设计(Domain Driven Design)参考架构详解 摘要 本文将介绍领域驱动设计(Domain Driven Design)的官方参考架构,该架构分成了Interfaces.Applications和Domain三层以及包含各类基础设施的Infrastructure.本文会对架构中一些重要组件和问题进行讨论,给出一些分析结论.本文原文连接:http://blog.