新人求帮!asp.net三层架构困惑,我这样算三层结构么?
小弟是asp.net新手,最近看了网上的很多关于asp.net三层结构的资料,petshop又看不懂,还是迷糊的很!自己想了很久,做一个小例子!请个各位大侠看看这算“三层结构”么!
功能是 输入产品名称查寻信息
1、vs2005新建了一个解决方案,添加了2个项目和1个网站,DataLayer(处理数据层),
LogicLayer(处理业务层),WebSite(表现层)。添加好了引用和依赖关系!
2,在DataLayer项目里建一个处理数据库操作的类AccDataBase
public class AccDataBase
{
private string connectionString = ConfigurationManager.AppSettings[ "AccessConntionString "];
private OleDbConnection myConn;
private OleDbCommand myComm;
private OleDbDataReader myReader;
public void Open()
{
myConn = new OleDbConnection(connectionString);
myConn.Open();
}
public OleDbDataReader GetReader(string sqlStr)
{
Open();
myComm = new OleDbCommand(sqlStr, myConn);
myReader = myComm.ExecuteReader(CommandBehavior.CloseConnection);
return myReader;
}
}
3,在业务曾LogicLayer项目里建一个类Goods
public class Goods
{
public OleDbDataReader GetGoodsInfor(string keyworks)
{
AccDataBase ADB = new AccDataBase(); OleDbDataReader myReader;
myReader = ADB.GetReader( "select * from TbGoods where name = ' " + keyworks+ " ' ");//===========调用了数据层
return myReader;
}
}
4,在表现层WebSite的default.aspx.cs按钮事件里
Goods goods= new Goods();
OleDbDataReader myReader = goods.GetGoodsInfor(TextBox1.Text);//=调用了业务曾
if (myReader.Read())
{
Response.Write(myReader[0].ToString() + myReader[1].ToString()...);//这里显示出来
}
myReader.Close();
5、完了
以前我都是将DataLayer放在App_Code的类里的,然后在default.aspx.cs里就直接将sql语句传给它,就返回DataReader,多简单明了。为什么要多出个业务层!?
我不明白asp.net三层架构的思想! 希望哪位高人醍醐灌顶一下
[解决办法]
楼主的程序算是三层了。不要为分层而分层,分层会带来性能的损耗。但是如果一个项目大了就需要分层了。要在开发效率和效率直接找一个平衡点。
[解决办法]
你这个怎么算三层啊.
AccDataBase只能算是一个数据操作类
业务曾LogicLayer项目里建一个类Goods,你做的是数据层的事情.
表现层WebSite的default.aspx.cs按钮事件里你做了部分的业务处理层的事情
你这个只能算是比后台写代码稍微好点,建议楼主看看PETSHOP,用个简单的三层就知道了
DAL BLL UI
[解决办法]
LogicLayer 居然在拼 SQL —— SQL 属于数据访问层!
LogicLayer 应关注业务逻辑的处理。
三层仅仅是一个逻辑三层,真正实现时很可能多于三个 Project。
有时间多读读 .NET 示例程序吧!
不读代码永远不会写代码——这是俺做开发两年来的经验总结,信不信由你,哈
[解决办法]
public class Goods
{
public OleDbDataReader .....
————————————————————————————————————————
仅看这开头两行就没有面向对象设计的味道了。
没有面向对象风格代码习惯做支持,谈分层就是无本之木永远争论不清了。
[解决办法]
对于三层架构一直没有一个统一的模式,尤其是业务罗基层究竟做什么.网上关于这个话题很多,可以搜搜.三层架构是逻辑关系,不一定对应3个项目(或网站).而且对于小项目用三层架构不一定便利.应该根据实际情况而定.
[解决办法]
分层的思想不是三言两语就能解释清楚的,从你的代码来看,完全没有一点分层的概念。
看看你所谓的表现层:
Response.Write(myReader[0].ToString() + myReader[1].ToString()...);
这里的myReader[0],[1] 表示什么意思?如果用分层的思想,这里是不应该这样调用的,或者说你在表现层,不应该关心数据库里面有哪些表,哪些字段,每个字段表示什么意思。
考虑你这一句:OleDbDataReader myReader = goods.GetGoodsInfor(TextBox1.Text);
他是获得一个产品的信息,但是产品有哪些信息?你如果只给表现层的编程人员提供一个datareader,这显然是不够的,他就必须去弄清楚这个datareader每个值的含义,那就必须要去看数据库的表结构,如果以后表结构一旦发生变化,那可能myreader[0]的含义也会发生变化,这样表现层也必须做出相应的修改,这是不符合分层逻辑的。
那么该如何做呢?
你可以专门编写一个产品类 :GoodInfo
这个类包含了产品的一些基本信息,比如编号,名称,价格等等
public class GoodInfo
{
public int ID;
public string Name;
public decimal Price;
}
//注意这里只是个示例,不是实际代码
然后 goods.GetGoodsInfo 这个方法就可以用来返回一个 GoodInfo 的对象
public GoodInfo GetGoodsInfo(int goodId);
这样表现层的编程人员就不需要关心数据库的结构了
你的代码就可以改成:
Goods goods= new Goods();
GoodInfo goodInfo = goods.GetGoodsInfo(id);
Response.Write(goodInfo.ID+goodInfo.Name+goodInfo.Price);
这样就可以帮助表现层的开发人员脱离数据库的限制,达到分层的目的。
时间问题,就不多说了,希望可以在这里起个抛转引玉的作用,有兴趣的可以一起研究,我的email:reman83@gmail.com
[解决办法]
you can, i think,read this book: < <export C# business object> > ;
---------------------------------------------
EMail:bdbox@163.com 请给我一个与您交流的机会!