`
alovejun14
  • 浏览: 77698 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

ASP.NET三层架构详解

阅读更多

一、数据库

/*==============================================================*/

/* DBMS name:      Microsoft SQL Server 2000                    */

/*==============================================================*/

 

 

if exists (select 1

            from sysobjects

           where id = object_id('newsContent')

            and   type = 'U')

   drop table newsContent

go

 

 

/*==============================================================*/

/* Table: newsContent                                            */

/*==============================================================*/

create table newsContent (

   ID           int              identity(1,1)   primary key,

   Title          nvarchar(50)     not null,

   Content       ntext            not null,

   AddDate      datetime         not null,

  CategoryID    int              not null

)

go

 

 

二、项目文件架构

实现步骤为: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标签,在前台显示给界面

 

四、项目中的文件清单

代码
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->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"]; } } }

 

代码
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->2、SQLServerDAL项目 (1)SqlHelper.cs抽象类 using System; using System.Data; using System.Data.SqlClient; using DBUtility; namespace SQLServerDAL { /// <summary> /// SqlHelper 的摘要说明。 /// </summary> public abstract class SqlHelper { public static readonly string CONN_STR = ConnectionInfo.GetSqlServerConnectionString(); /// <summary> /// 用提供的函数,执行SQL命令,返回一个从指定连接的数据库记录集 /// </summary> /// <remarks> /// 例如: /// 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; } } }

 

代码
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->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; } } } }

 

 

 

 

代码
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->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); } } }

 

代码
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->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); } } }

 

 

代码
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->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> <span st
分享到:
评论

相关推荐

    asp.net三层架构详解

    这个文件可以帮助你理解什么叫做asp.net的三层架构

    ASP.NET三层架构详解 如何实现三层架构

    主要为大家详细介绍了ASP.NET三层架构,如何实现三层架构,本文为大家揭晓,感兴趣的小伙伴们可以参考一下

    asp_net三层架构详解

    asp.net三层架构详解 在.NET出现前,如果要构建三层及三层以上的多层架构的软件系统,往往要考虑跨计算机、跨网络之间的通讯方式,微软的产品对于跨网络的支持较少,而且实现复杂,令开发人员望而生畏。.NET的出现,...

    ASP.net-三层架构

    ASP.NET学习教程,三层架构详解,帮助爱好者学习好三层架构

    asp.net VS2008C#三层架构实际操作详解

    asp.net VS2008C#三层架构实际操作详解:一提三层架构,大家都知道是表现层(UI),业务逻辑层(BLL)和数据访问层(DAL),而且每层如何细分也都有很多方法。但具体代码怎么写,到底那些文件算在哪一层,却是模模...

    [源代码] 《ASP.NET夜话》 随书源代码

    第15章 — ASP.NET中的三层架构 第16章 — 单元测试 第17章 — ASP.NET中的GDI+技术 第18章 — ASP.NET报表技术 第19章 — .NET的文件IO体系和静态页面生成技术 第20章 — 数据安全技术 第22章 — 综合实例

    ASP.NET典型系统开发详解(第一部分)

    第三章PoRTAI.企业级门户网站 3.1系统总体设计 3.1.1系统架构描述 3.1-2系统功能模块描述 3.1.3数据库设计 3.1.4门户网站}I擎动作原理 3.1.5配置信息XM[。文件结构分析 3.1.6 XMI。配置文件操作类 ...

    ASP.NET典型系统开发详解第二部分

    第三章PoRTAI.企业级门户网站 3.1系统总体设计 3.1.1系统架构描述 3.1-2系统功能模块描述 3.1.3数据库设计 3.1.4门户网站}I擎动作原理 3.1.5配置信息XM[。文件结构分析 3.1.6 XMI。配置文件操作类 ...

    asp.net知识库

    深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托...

    ASP.NET Night Words

    第15章 asp.net中的三层架构 287 15.1 数据库通用类 287 15.1.1 sql server数据库访问 15.1.1 通用类 288 15.1.2 using关键字的用法 293 15.2 三层架构的定义及代码示例 294 15.3 三层架构的特点 309 15.4 对...

    petshop4.0

    微软宠物商店petshop4.0 详解 对于学习asp.net三层架构很有帮助

    ASP.NET3.5典型模块开发源代码

    15.2.2 如何在ASP.NET 3.5中调用Alexa的数据 170 15.3 自定义统计模块 171 15.3.1 设计保存IP数据的数据库 171 15.3.2 设计显示IP信息的界面 173 15.3.3 显示最近访问站点的10个IP信息 174 15.3.4 实现IP...

    微软petshop 4.0 详解

    微软 petshop 4.0 详解 三层架构 asp.net C#

    亮剑.NET深入体验与实战精要2

    14.1.2 趣味理解:三层架构与养猪 496 14.2 为什么要用三层架构 497 14.3 三层架构项目开发示例 500 14.3.1 数据库设计 500 14.3.2 创建整体解决方案 501 14.3.3 业务实体Model的实现 502 14.3.4 数据访问层的实现 ...

    亮剑.NET深入体验与实战精要3

    14.1.2 趣味理解:三层架构与养猪 496 14.2 为什么要用三层架构 497 14.3 三层架构项目开发示例 500 14.3.1 数据库设计 500 14.3.2 创建整体解决方案 501 14.3.3 业务实体Model的实现 502 14.3.4 数据访问层的实现 ...

    亮剑.NET深入体验与实战精要.part2

     第14章 三层架构项目开发  第15章 大型网站的性能优化与安全  第16章 系统设计的原则和技巧 第3篇 项目实战解析  第17章 权限角色管理项目解析  第18章 单点登录系统的设计与实现  第19章 常用.net开发...

    亮剑.NET:.NET深入体验与实战精要清晰版及源码

     第14章 三层架构项目开发  第15章 大型网站的性能优化与安全  第16章 系统设计的原则和技巧 第3篇 项目实战解析  第17章 权限角色管理项目解析  第18章 单点登录系统的设计与实现  第19章 常用.net开发...

Global site tag (gtag.js) - Google Analytics