再谈三层架构----老生常谈
1 三层架构
1.1 架构图
Ø 实体类模块——一组实体类的集合,负责整个系统中数据的封装及传递。
Ø 数据访问层接口族——一组接口的集合,表示数据访问层的接口。
Ø 业务逻辑层接口族——一组接口的集合,表示业务逻辑层的接口。
Ø 数据访问层模块——一组类的集合,完成数据访问层的具体功能,实现数据访问层接口族。
Ø 业务逻辑层模块——一组类的集合,完成业务逻辑层的具体功能,实现业务逻辑层接口族。
Ø 表示层模块——程序及可视元素的集合,负责完成表示层的具体功能。
Ø IoC容器模块——负责依赖注入的实现。
Ø 辅助类模块——完成全局辅助性功能。
使用反射,每个层只需要一个工厂,然后通过从配置文件中读出程序集的名称,动态加载相应类。另外,为了提高依赖注入机制的效率,这里引入缓存机制。下面来看具体实现。
配置
首先,需要在Web工程的Web.config文件的<appSettings>节点下添加如下两个项:
<add key="DAL" value=""/>
<add key="BLL" value=""/>
这两个配置选项分别存储要应用的数据访问和也业务逻辑层的程序集名称。value目前是空,是因为目前还没有各个层次的具体实现。
1.2 实例
1.2.1 DAC层
1.2.1.1 DAC接口
1.2.1.1.1 IACL_FUNCTION
public interface IACL_FUNCTION
{
#region 成员方法
/// <summary>
/// 增加一条数据
/// </summary>
bool Add(STC.Task.Model.ACL_FUNCTION model);
/// <summary>
/// 更新一条数据
/// </summary>
bool Update(STC.Task.Model.ACL_FUNCTION model);
/// <summary>
/// 删除一条数据
/// </summary>
bool Delete(string ID);
/// <summary>
/// 得到一个对象实体
/// </summary>
STC.Task.Model.ACL_FUNCTION GetModel(int ID);
/// <summary>
/// 获得数据列表
/// </summary>
//DataSet GetList(string strWhere);
/// <summary>
/// 根据分页获得数据列表
/// </summary>
// DataSet GetList(int PageSize,int PageIndex,string strWhere);
#endregion 成员方法
}
1.2.1.1.2 IBaseDataHelper
/// <summary>
/// 公用数据接口主要用于查询,事务等复杂的数据操作
/// </summary>
public interface IBaseDataHelper
{
/// <summary>
/// 通过SQL语句返回DataSet
/// </summary>
/// <param name="strSql">传入的SQL语句</param>
/// <returns></returns>
DataSet BaseQuery(string strSql);
/// <summary>
/// SQL语句执行
/// </summary>
/// <param name="strSql">传入的SQL语句</param>
/// <returns>影响的行数</returns>
int ExecuteSql(string strSql);
/// <summary>
/// 执行事务
/// </summary>
/// <param name="SQLStringList">传入的SQL语句数组</param>
/// <returns>是否成功</returns>
bool ExecuteSqlTran(ArrayList SQLStringList);
/// <summary>
/// 执行事务
/// </summary>
/// <param name="SQLStringList">传入的SQL语句HashTable</param>
/// <returns>是否成功</returns>
bool ExecuteSqlTran(Hashtable SQLStringList);
/// <summary>
/// 通过SQL语句得到单个数据
/// </summary>
/// <param name="strSql">传入的SQL语句</param>
/// <returns>数据对象</returns>
object GetSingle(string strSql);
}
1.2.2 BLL层:
1.2.2.1 业务对外接口IBLL
public interface ITaskManagerBLL
{
/// <summary>
/// 撤单
/// </summary>
/// <param name="TaskNum">任务编号</param>
/// <param name="Status">操作状态</param>
/// <returns></returns>
bool OperationCommonTask(string TaskNum,string Status);
}
1.2.2.2 业务实现BLL
public class TaskManagerBLL : ITaskManagerBLL
{
#region 撤单
/// <summary>
/// 撤单
/// </summary>
/// <param name="TaskNum"></param>
/// <param name="Status"></param>
/// <returns></returns>
public bool OperationCommonTask(string TaskNum, string Status)
{
string strSql = "update JYSC_RWGL_SCRWJL set status='" + Status + "' where rwdbh='" + TaskNum + "'";
int iCount = OracleDALFactory.DataAccess.CreateBaseDataHelper().ExecuteSql(strSql);
if(iCount>0)
{
return true;
}
else
{
return false;
}
}
#endregion
}
1.2.3 界面调用
protected void btnWithdrawSubmit_Click(object sender, EventArgs e)
{
BLLAccess.CreateTaskManagerBLL().OperationCommonTask(RWDBH.Value,BLLConfig.WithDrawTaskStatus );
Response.Write("<script>alert('您撤单成功')</script>");
Response.Redirect("../TaskOperate/WithdrawTask.aspx", true);
}