前些阵子照着《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程序集

Code
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

Code
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类功能我们都会用到,我们只应用到了一小部分

Code
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自定义一些类
具体的一些内容留在下面文章分析
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述