已经到新的工作岗位上有3个星期的时间了,现在跟了一个某保险公司的OA系统的项目,这时才体会什么是真正意义上的三层架构,什么才叫系统,什么才叫项目。来这个公司以前,虽然自己也做过asp.net的小项目,以为在app_code里加几个类就是三层架构了,可现在再拿那些项目来看,真的相差很远……(当然,这篇文章只是我个人的理解,肯定有不足之处,还请高手多多指点)
下面只以我现在跟的那个OA系统作为实例来分析一下。
既然是三层,肯定在物理逻辑上就要进行区分的,因此在项目文件夹下,有WebUI、BLL、DAL、Common这四个文件夹和Default.aspx等首页文件,其实最主要的就是前三个文件夹,Common文件夹里保存了一些样式文件和JS文件,个人感觉这些文件可以放到WebUI里的。o(∩_∩)o...,这几个文件夹用来作什么应该从命名上能看出来吧?WebUI用来保存页面文件,也就是大家在浏览网页的时候能看见的,最直观的,也是这三层中最简单的;BLL用来保存业务逻辑,起到一个承上启下的作用,用来连接WebUI层和DAL层,主要是定义一些方法,相对来讲比WebUI要复杂;DAL文件夹主要是保存对数据库操作的一些文件,主要是对一些SQL语句(存储过程)的执行。这三层之间的关系是上层引用下层,即WebUI引用BLL,BLL引用DLL。这三层联系起来就是这样一个过程:在页面添加一些信息经过合理性判断(WebUI)后调用BLL层的函数(方法),下面的代码属于WebUI层
int
intUserID
=
(
int
)
this
.LogonUser.User_Emp.Rows[
0
][
"
UserId
"
];
//
获得当前登陆用户的ID
DataSet ds
=
contractRule.GetContractList_By_ApplicantID( intUserID, flag, rentName, startDate, endDate, isOpen );//其中GetContractList_By_ApplicantID()就是ContractRule.cs(BLL层)中的一个方法
ds.Tables[
0
].DefaultView.Sort
=
ViewState[
"
Sort
"
].ToString();
this
.dgPayment.DataSource
=
ds.Tables[
0
].DefaultView;
this
.dgPayment.DataKeyField
=
"
ContractID
"
;
this
.dgPayment.DataBind();
在ContractRule.cs页面根据传过来的数据再调用ContractDA.cs(DLL层)的方法,下面的代码属于BLL层
/**/
/// <summary>
/// 根据用户获得合同信息
/// </summary>
/// <param name="intApplicantID"></param>
/// <param name="flag"></param>
/// <param name="contractName"></param>
/// <param name="dtBeginDate"></param>
/// <param name="dtEndDate"></param>
/// <returns></returns>
public
DataSet GetContractList_By_ApplicantID(
int
intApplicantID,
int
flag,
string
contractName, DateTime dtBeginDate, DateTime dtEndDate,
bool
isOpen)

...
{
using( ContractDA contractDA = new ContractDA() )

...{
return contractDA.GetContractList_By_ApplicantID( intApplicantID,flag,contractName,dtBeginDate,dtEndDate,isOpen);//其中GetContractList_By_ApplicantID()是ContractDA.cs(DLL层)页面中的一个方法
}
}
在ContractDA.cs页面中的GetContractList_By_ApplicantID()方法根据传入的信息,通过SQL语句(存储过程)来进行对数据库的操作。下面的代码属于DAL层
/**/
/// <summary>
/// 根据用户获得合同信息
/// </summary>
/// <param name="intApplicantID"></param>
/// <param name="flag"></param>
/// <param name="contractName"></param>
/// <param name="dtBeginDate"></param>
/// <param name="dtEndDate"></param>
/// <returns></returns>
public
DataSet GetContractList_By_ApplicantID(
int
intApplicantID,
int
flag,
string
contractName, DateTime dtBeginDate, DateTime dtEndDate,
bool
isOpen)

...
{
SqlCommand command = new SqlCommand();

command.CommandText = "Contract_Query";//存储过程名
command.Connection = this.mySqlConnection;
command.CommandType = CommandType.StoredProcedure;

command.Parameters.Add( "@ApplicantID", intApplicantID );//传入参数
//tg070712
command.Parameters.Add( "@Flag", flag );/传入参数
command.Parameters.Add( "@ContractName", contractName );/传入参数
command.Parameters.Add( "@BeginDate", dtBeginDate );/传入参数
command.Parameters.Add( "@EndDate", dtEndDate );/传入参数

this.mySqlDataAdapter.SelectCommand = command;
DataSet ds = new DataSet();
this.mySqlDataAdapter.Fill( ds );
return ds;//返回ds数据集
}
至此,一个三层意义上的数据流转过程就完成了。因为自己入门不是很深,所以上面的想法未免有纰漏,还请各路高手指点。