我正在学用三层结构做c#的全站程序,想请问大侠几个问题,谢谢!
1.我应该把操作数据库的代码放在哪层?(比如 添加信息 修改信息 更新信息 插入信息 删除信息等)是应该放在业务逻辑层还是数据访问层?
2.数据访问层是不是主要的放连接数据库的字符串还是放一些其他的代码啊?
比如连接数据库的字符串strConnection = @"Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " + System.Web.HttpContext.Current.Server.MapPath (dbname) + ";";
3.业务逻辑层主要的放些什么代码?能不能举个简单的例子啊?谢谢!我越看书越糊涂啊.
1.我应该把操作数据库的代码放在哪层?(比如 添加信息 修改信息 更新信息 插入信息 删除信息等)是应该放在业务逻辑层还是数据访问层?
2.数据访问层是不是主要的放连接数据库的字符串还是放一些其他的代码啊?
比如连接数据库的字符串strConnection = @"Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " + System.Web.HttpContext.Current.Server.MapPath (dbname) + ";";
3.业务逻辑层主要的放些什么代码?能不能举个简单的例子啊?谢谢!我越看书越糊涂啊.
数据层-->业务层-->表示层
象sql语句,连接数据库等写在数据层
象加密算法等跟业务有关的写在业务层,还包括和数据层的交互方法
表示层就放页面的东西,
参考源码
D:\Program Files\Microsoft Visual Studio .NET 2003\Enterprise Samples\Duwamish 7.0 CS
http://www.v155.com/bbs/Dispbbs.asp?BoardID=12&replyID=1443&id=415&skin=0
2、数据访问层最好只放数据操作。对于数据连接字符串等可以另类,作为公用资源。如可以实现数据操作的方法,protected DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName );protected SqlDataReader RunProcedure(string storedProcName, IDataParameter[] parameters )等。这样在数据访问层就可以直接调用。
3、业务逻辑层实现数据流
4、建议你可以看看MSPetShop的结构,它扩展了3层结构,采用数据实体进行数据传递(Model层),
用接口层声明所需要方法(IDAL层),采用工厂模式扩展系统功能,实现多个数据库连接(FactoryDAL),在数据访问层(SQLServerDAL/OracleDAL)继承IDAL的方法,并具体实现。业务逻辑层(BLL)提供与Web层的接口。
过程如下
表示层
private void BindData()
{
ds=ActivityBLL.GetActivityListByAccountID(userid);
if (ds!=null && ds.Tables.Count>0)
{
DataGrid1.DataSource = ds;
DataGrid1.DataBind();
}
}
业务层
public static DataSet GetActivityListByAccountID(string userid)
{
DataSet ds=ActivityBLL.GetActivityListByAccountID(userid);
return ds;
}
数据层
public static DataSet GetActivityListByAccountID(string userid)
{
string sql="select * from ActivityBase ";
sql=sql+" where ActivityBaseID='"+userid+"'";
return DataHelper.ExecuteDataset(sql);
}
{
DataSet ds=ActivityBLL.GetActivityListByAccountID(userid);
return ds;
}
{
DataSet ds=ActivityDAL.GetActivityListByAccountID(userid);//调用dal层的方法,返回dataset,然后再返回给表示层
return ds;
}
这个方法就是写在业务层和数据层相关联的方法,业务层还可以包含其他,如
public static IList ListType()
{
ArrayList list=new ArrayList();
foreach(int i in Enum.GetValues(typeof(ImmigrationTracker.Utility.EnumActivityType)))
{
ListItem listitem = new ListItem(Enum.GetName(typeof(ImmigrationTracker.Utility.EnumActivityType),i),i.ToString());
list.Add(listitem);
}
return list;
}
这个方法是返回给表示层绑定dropdownlist的,并没有去读取数据,而是用了一个枚举,等等,在表示层写起来来比较多,可能会部分公用等,都可以写业务层,加密呀,日期格式处理呀等等都可以
您举的例子中的代码,觉得是可以直接调用数据访问层的,但是如果在业务层还有其他的一些业务规则,就应该是你那样了,比如:业务层
public static DataSet GetActivityListByAccountID(string userid)
{
if( int.parse( userid ) > 12 )
{
DataSet ds=ActivityBLL.GetActivityListByAccountID(userid);
return ds;
}
else
{return null ;}
}业务层和数据访问层还是可以具体划分,看实际情况。
数据访问层,安照
面向对象的应用服务层设计
作者:孙亚民
http://www.blueidea.com/tech/program/2004/1650.asp
//实战揭秘:开发.Net平台应用系统框架
//作者:孙亚民
//http://www.68asp.com/Article/CJ/200409/845.html
的说法,最好再内部划分一下