浅析电子商务的框架_.Net教程
推荐:解读多语言开发的个人体验在文章的前面,先定义一下,这里谈的语言(A)指的是语言以及使用该语言可以很容易调用的基本类库及可免费或低代价获得的第三方类库及开源类库(B)。在很多情况下谈语言和谈语言的选择时的语境,都是指的B。 选择多语言混合开发的一个目的是为了使用其中某
前些阵子照着《Pro ASP.NET 2.0 E-Commerce in C#2005》书编辑了一个商务系统网站,想总结一下学习到的所学的知识。
该网站具有一般商务网站的特征
这里先讲讲他的框架
数据访问层
用的的存储过程操作数据库的存储,有一个Shop.DataAccess类库专门(注意我这里将原文的命名空间改为shop了)
该类库使用了一个组件来封装对数据库的操作 为 Microsoft Data Access Application Block, 其实就是将SQLHelper.cs复制到该类下就行了,该类可以自动管理存储过程的连接,参数和名称。
类库下的DataAccessBase类是一个基类,该类库几乎所有的类都会继承它,有两个属性一个是存储过程,以及返回数据库的连接字符串
注意:这里是从web.config文件中获取与数据库连接的字符串,但是在类中无法引用到Configuration类,所以我们要额外的添加引用System.Configuration.dll程序集
以下为引用的内容: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Configuration; namespace Shop.DataAccess { public class DataAccessBase { //存储过程的名称 protected string StoredprocedureName { set; get; } //获得连接字符串 protected string ConnectionString { get { return ConfigurationManager.ConnectionStrings["db_shopConnectionString"].ToString(); } } } } |
类库中的StoreProcedure类
利用枚举存储编写的存储过程名称,这样便于更改及管理
但是对于存储过程很多,一个类来存储肯定显得不够,个人建议在细分,控制一个类中的存储过程不超过20个
例如:
StoreProcedure_User,StoreProcedure_Product,StoreProcedure_Orders
以下为引用的内容: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Shop.DataAccess { public class StoredProcedure { public enum Name { ProductByID_Select, Products_Select, Products_SelectSerach, ShoppingCart_Select, ShoppingCart_Insert, ShoppingCart_Update, ShoppingCart_Delete, EndUser_Insert, EndUserLogin_Select, Address_Select, ContactInformation_Select, AdminLogin_Select, Product_Insert, ProductCategory_Select, Product_Update, Orders_Select, OrderDetails_Select, OrderAll_Select, OrderStatus_Select, OrdersByID_Select, Orders_Update, ProductPromotion_Select } } } |
类库中的DataBaseHelper类
重新包装了SQLHelper类的功能,因为并不是所有SQLHelper类功能我们都会用到,我们只应用到了一小部分
以下为引用的内容: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; using Microsoft.ApplicationBlocks.Data; using System.Data; namespace Shop.DataAccess { public class DataBaseHelper:DataAccessBase { public SqlParameter[] Parameters { get; set; } /// <summary> /// 构造函数 /// </summary> /// <param name="storedproceducename">赋值存储过程</param> public DataBaseHelper(string storedproceducename) { this.StoredprocedureName = storedproceducename; } /// <summary> /// 无数据返回 /// </summary> /// <param name="transaction"></param> public void Run(SqlTransaction transaction) { SqlHelper.ExecuteNonQuery(transaction, CommandType.StoredProcedure, this.StoredprocedureName, this.Parameters); } /// <summary> /// 无数据返回,自己提供参数 /// </summary> /// <param name="transaction"></param> /// <param name="Parameters">参数</param> public void Run(SqlTransaction transaction, SqlParameter[] Parameters) { SqlHelper.ExecuteNonQuery(transaction, CommandType.StoredProcedure, this.StoredprocedureName, Parameters); } /// <summary> /// 有参数返回(DataSet) /// </summary> /// <param name="connectionstring"></param> /// <param name="parameters"></param> /// <returns></returns> public DataSet Run(string connectionstring, SqlParameter[] parameters) { DataSet ds; ds = SqlHelper.ExecuteDataset(connectionstring, this.StoredprocedureName, parameters); return ds; } /// <summary> /// 返回第一行第一列的值 /// </summary> /// <param name="connectionstring"></param> /// <param name="parameters"></param> /// <returns></returns> public object RunScalar(string connectionstring, SqlParameter[] parameters) { object obj; obj = SqlHelper.ExecuteScalar(connectionstring, this.StoredprocedureName, parameters); return obj; } /// <summary> /// 返回第一行第一列的值 /// </summary> /// <param name="transaction"></param> /// <param name="parameters"></param> /// <returns></returns> public object RunScalar(SqlTransaction transaction, SqlParameter[] parameters) { object obj; obj = SqlHelper.ExecuteScalar(transaction, this.StoredprocedureName, parameters); return obj; } /// <summary> /// 无参数返回(DataSet) /// </summary> /// <param name="connectionstring"></param> /// <returns></returns> public DataSet Run(string connectionstring) { DataSet ds; ds = SqlHelper.ExecuteDataset(connectionstring, CommandType.StoredProcedure, this.StoredprocedureName); return ds; } /// <summary> /// 无返回值 /// </summary> public void Run() { SqlHelper.ExecuteNonQuery(base.ConnectionString, CommandType.StoredProcedure, this.StoredprocedureName, this.Parameters); } /// <summary> /// 返回是SqlDataReader /// </summary> /// <param name="parameters"></param> /// <returns></returns> public SqlDataReader Run(SqlParameter[] parameters) { SqlDataReader dr; dr = SqlHelper.ExecuteReader(base.ConnectionString, CommandType.StoredProcedure, this.StoredprocedureName, parameters); return dr; } } } |
业务逻辑层
Shop.BusinessLogic
这里涉及到要编写接口
首先了解下什么是接口,接口就是只包含抽象成员的应用类型,接口中的成员可以是方法,索引器,属性和事件,而不可以是包含任何常量,构造函数,静态成员或数据字段。接口只包含这些成员的声明。而具体的实现必须从实现该接口的任何类中进行初始化。
这里编辑一个接口是因为所有该类库的类都会调用一个函数来实现获得数据
以下为引用的内容: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Shop.BusinessLogic { interface IBusinessLogic { void Invoke(); } } |
Shop.Common类库是编写一个公共类
Shop.Operational自定义一些类
分享:解析ASP.NET Routing对请求的处理方式原本这是《关于ASP.NET Routing的几点内容》一文中的一节,不过等写完这节之后发现这块内容已经比较完整了,而且它本身也是独立和最为常见的部分,因此我把它提取出来单独成文。至于那片文章的其他部分我会再修改一下,明天发布。希望这些内容会对您理解ASP.
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP发送Email实例(可带附件)
- js实现广告漂浮效果的小例子
- asp.net Repeater 数据绑定的具体实现
- Asp.Net 无刷新文件上传并显示进度条的实现方法及思路
- Asp.net获取客户端IP常见代码存在的伪造IP问题探讨
- VS2010 水晶报表的使用方法
- ASP.NET中操作SQL数据库(连接字符串的配置及获取)
- asp.net页面传值测试实例代码
- DataGridView - DataGridViewCheckBoxCell的使用介绍
- asp.net中javascript的引用(直接引入和间接引入)
- 三层+存储过程实现分页示例代码
- 相关链接:
- 教程说明:
.Net教程-浅析电子商务的框架。