昏倒啊!三层架构到底怎么弄啊,教程讲的都是不清不楚的!高手请速来。

singit5 2009-04-21 11:49:13
我接触.NET有一两年了,可是没有什么三层的观念(跟语言有关?我用的VB,跟书学的,书里边也没有三层的概念啊!),现在找工作之机,感觉到应该重新学习一下什么是架构,语言最好也换成C#。

然后我搜索了网上N多例子,不是直接给出源码(那样看不明白原理呀),就是讲的不清不楚,请看以下案例:
http://www.uml.org.cn/net/200902124.asp

这个例子只讲了如何引用各层,可是要怎么运行啊!!
连一些代码都没有哎,晕。


像图示那样架构设计好,请问怎么运行?各层到底怎么引用啊,原理是什么呢??
请各位热心的高手给解释解释吧,我急死了。最好能配以简单的代码能让程序运行起来,拜托了,谢谢!
...全文
1100 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
caca99 2012-04-28
  • 打赏
  • 举报
回复
只要多多的实习就可以了,这是我老师说的,他可是博士精通这个
singit5 2009-05-30
  • 打赏
  • 举报
回复


public class dl
{

string constr = System.Configuration.ConfigurationManager.ConnectionStrings["CBooksConnectionString"].ToString();

public DataSet selectds()
{
SqlConnection mycon = new SqlConnection(constr);
DataSet myds = new DataSet();
using (mycon) {
mycon.Open();
SqlDataAdapter sda = new SqlDataAdapter("select * from books",mycon);
sda.Fill(myds);

}
return myds;
}

public void deleteok(int bookid)
{
SqlConnection mycon = new SqlConnection(constr);
using(mycon)
{

SqlCommand scom = new SqlCommand("delete from books where bookid=@bid",mycon);
scom.Parameters.Add("@bid", SqlDbType.Int, 8).Value = bookid;
mycon.Open();
int okvalue = scom.ExecuteNonQuery();
return okvalue;
}

}

public int updateok(string bookID, string bookTitle, string bookISBN, int bookPrice,
string bookPublisher, string bookAuthor, string bookCoverUrl,
DateTime bookDate)
{
int returnValue;
SqlConnection mycon = new SqlConnection(constr);
using(mycon)
{

string sqlstr = "UPDATE Books SET " +
"bookTitle=@bookTitle, " +
"bookISBN=@bookISBN, " +
"bookPrice=@bookPrice, " +
"bookPublisher=@bookPublisher, " +
"bookAuthor=@bookAuthor, " +
"bookCoverUrl=@bookCoverUrl, " +
"bookDate=@bookDate " +
"WHERE " +
"bookID = @bookID ";
SqlCommand sqlCmd = new SqlCommand(sqlstr, mycon);
if (bookCoverUrl == null) bookCoverUrl = "";
sqlCmd.Parameters.Add("@bookID", SqlDbType.NChar, 10).Value = bookID;
sqlCmd.Parameters.Add("@bookTitle", SqlDbType.NChar, 50).Value = bookTitle;
sqlCmd.Parameters.Add("@bookISBN", SqlDbType.NChar, 20).Value = bookISBN;
sqlCmd.Parameters.Add("@bookPrice", SqlDbType.Int).Value = bookPrice;
sqlCmd.Parameters.Add("@bookPublisher", SqlDbType.NChar, 10).Value = bookPublisher;
sqlCmd.Parameters.Add("@bookAuthor", SqlDbType.NChar, 10).Value = bookAuthor;
sqlCmd.Parameters.Add("@bookCoverUrl", SqlDbType.NChar, 50).Value = bookCoverUrl;
sqlCmd.Parameters.Add("@bookDate", SqlDbType.DateTime).Value = bookDate;
mycon.Open();
returnValue = sqlCmd.ExecuteNonQuery();

}

return returnValue;

}

public void insertok(string bookID, string bookTitle, string bookISBN, int bookPrice,
string bookPublisher, string bookAuthor, string bookCoverUrl,
DateTime bookDate)
{
if (bookID == null) return ;
if (bookID.ToString() == "") return ;


int returnValue;
SqlConnection mycon = new SqlConnection(constr);
using (mycon)
{

string sqlstr = "insert into Books(bookTitle,bookISBN,bookPrice,bookPublisher,bookAuthor,bookDate,bookID,bookCoverUrl) " +
" values(@bookTitle,@bookISBN,@bookPrice,@bookPublisher,@bookAuthor,@bookDate,@bookID,@bookCoverUrl)";


SqlCommand sqlCmd = new SqlCommand(sqlstr, mycon);
if (bookTitle == null) bookTitle = "";
if (bookISBN == null) bookISBN = "";
if (bookPublisher == null) bookPublisher = "";
if (bookAuthor == null) bookAuthor = "";
if (bookCoverUrl == null) bookCoverUrl = "";
if (bookPrice == null) bookPrice = 0;

sqlCmd.Parameters.Add("@bookID", SqlDbType.NChar, 10).Value = bookID;
sqlCmd.Parameters.Add("@bookTitle", SqlDbType.NChar, 50).Value = bookTitle;
sqlCmd.Parameters.Add("@bookISBN", SqlDbType.NChar, 20).Value = bookISBN;
sqlCmd.Parameters.Add("@bookPrice", SqlDbType.Int).Value = bookPrice;
sqlCmd.Parameters.Add("@bookPublisher", SqlDbType.NChar, 10).Value = bookPublisher;
sqlCmd.Parameters.Add("@bookAuthor", SqlDbType.NChar, 10).Value = bookAuthor;
sqlCmd.Parameters.Add("@bookCoverUrl", SqlDbType.NChar, 50).Value = bookDate;
sqlCmd.Parameters.Add("@bookDate", SqlDbType.DateTime).Value = dtt;


mycon.Open();
returnValue = sqlCmd.ExecuteNonQuery();

}

return returnValue;
}


}




public class bl
{

public bl()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

public qds.BooksDataTable getdata(string bid)
{
qdsTableAdapters.BooksTableAdapter booktb = new qdsTableAdapters.BooksTableAdapter();
qds.BooksDataTable d1 = booktb.GetDataBy(bid);
return d1;
}

public int upblok(string bookTitle, int bookPrice, string original_bookID,string bookDate)
{
qdsTableAdapters.BooksTableAdapter booktb = new qdsTableAdapters.BooksTableAdapter();
int okre = booktb.upq(bookPrice, bookTitle, original_bookID);
return okre;
}
public void blinertok(string original_bookID, string bookDate,string bookID)
{
if (bookDate == null) { throw new Exception("no date!!"); }
if (bookID == null) { throw new Exception("no id!!"); }
DateTime dt = DateTime.Parse(bookDate);
if (dt == null) dt = DateTime.Now;
qdsTableAdapters.BooksTableAdapter qds = new qdsTableAdapters.BooksTableAdapter();
qds.InsertQuery(bookID,dt);
}

}


zhushoudong 2009-05-12
  • 打赏
  • 举报
回复
自己做个小的系统 想想动手去写下就OK了
zzxap 2009-05-12
  • 打赏
  • 举报
回复
http://blog.csdn.net/jayzeng/archive/2008/03/31/2232764.aspx
zzxap 2009-05-12
  • 打赏
  • 举报
回复
TO:1、修改数据时,先把代表所修改数据记录各值的实体类对象通过xml序列化存到本地的一个xml文档中;
2、在页面修改数据部分字段值;
3、页面修改完,将修改后各值赋给一个新的实体类对象,在此暂称:修改后数据实体对象
4、提交保存之前,再new一个此实体类对象,通过xml反序列化,把第1步中所保存在本地xml文档进行反序列化给此实体类对象,在此暂称:修改前数据实体对象;
5、提交保存时,将这两个分别代表记录修改前后的实体对象都传到DAO层修改函数,在DAO层对两个对象各数据值进行比较,凡是值不同(即此值被修改了),就update;反之,就不update了。

感觉这样做效率也太低了一点...
那你这样序列化又反序列化的,还不如创建两个对象,一个用于保存修改前,一个用于存储修改后的呢?
我觉得秋枫大哥的办法很好"在实体类内部增加一个State属性,来表示修改,新增或是删除"..
V68V6 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 vrhero 的回复:]
你看的书不对,去看看软件工程...

分层方法不是架构技术而是工程学,生搬硬套是难以理解的,所以也是讲不清楚的...需要你有软件工程的理论基础然后在实践中去体会...
[/Quote]
说的很有道理,要真正分好层是工程学上的东西,除此之外还有很多经验方面的东西。不是一个初学者就可以嚼透的。其实分层也不局限于三层,分层的具体数目要根据业务需要。简单的应用一层也就够了,没必要吊死在三层不放。复杂一点的有可能有N层。三层只是比较常用的分层手段。另外你这个例子不够简单,我举一个简单的例子:
假如你要做一个BBS留言版,你如果不分层,那么除了界面之外。你数据操作和业务逻辑(留言实现)可能杂糅在一块,这样明显不方便以后的业务填充和日常维护以及模块循环使用。如果用分层实现,则可以这样定义三层:
1.留言板页面的外观代码(UI)都存放在 .aspx 文件中
2.当用户点击页面上的提交按钮时,先将文本信息传递给一个 LeaveWord 类对象(LeaveWord 类(留言操作实现代码段)的定义被封装到“商业逻辑层”)
3.之后让这个对象执行 Post() 将留言信息发送到数据库,post()为数据库操作代买段。

如果日后你要修改留言逻辑代码,直接修改2就好了。1,3不用去动,大大方便了开发人员。
分层的核心思想就是:最大限度的简化编码杂糅度,提高代码复用和维护。

用一个伪代码段说明就死
<textarea id="Content" runat ="server"></textarea>
<input type="button" id="Post" runat ="server" />

// ----------------------------------------
// 在外观层,当用户点击发送按钮后
// ----------------------------------------
private void Post_ServerClick(object sender, EventArgs e)
{
LeaveWord lword=new LeaveWord();
lword.Content=Content.Value;
lword.Post();
}

// ----------------------------------------
// 在商业逻辑层,定义 LeaveWord 类
// ----------------------------------------
public class LeaveWord
{
public string Content;

public void Post()
{
new LWordData().Post(this.Content);
}
}

// ----------------------------------------
// 数据库层,定义发送方法
// ----------------------------------------
public class LWordData
{
public void Post(string content)
{
// 打开数据库,将 content 插入到表中
}
}



分层原则:
上层调下层
上层对下层是不可见的
设计时,表现层只调用逻辑层,表现层主要是取得页面的数据传到逻辑层,把从逻辑层得到的数据显示到页面上。
逻辑层负责把数据加工整理传到数据层和把从数据层取得的数据加工。
数据层就只负责把数据对数据库操作。
CompilerZy 2009-04-22
  • 打赏
  • 举报
回复
UI层通过逻辑层访问数据层
数据层将结果通过逻辑层返回给UI层
singit5 2009-04-22
  • 打赏
  • 举报
回复
楼上两位的回答虽然没用,但还是谢谢你们。

请问如何运行?运行!!一层一层怎么套?
anzhiqiang_touzi 2009-04-22
  • 打赏
  • 举报
回复
DAL数据访问
BLL业务逻辑
UI界面
这就是三层
一层一曾的引用:DAL->BLL-UI
很简单:有时候不知道怎么说:(比如:您问:太阳为什么回从东方升起:我也不知道)
fdc123 2009-04-22
  • 打赏
  • 举报
回复
我也在学这个东西 也是只明白含义 不知道该怎么自己写, 每次自己写代码都是在控件的事件里面一下写很长 自己也觉得不是很好 就建一个类把长用的连接方法写进去 然后在直接调用 不知道这算不算2层。。。
jdhlowforever 2009-04-22
  • 打赏
  • 举报
回复
学习下
JNyubojie 2009-04-22
  • 打赏
  • 举报
回复
兄弟,不用太急了。都还没工作,以你现在的水准应该还算可以的了(对于学生来说),不过要搞明白三层还是需要点时间的,理论与实践都要的,你现在还是没什么环境搞明白这些东西的,还是要有项目实践才行。在学校就多积累些理论知识吧,以后会有用的。
xqhrs232 2009-04-22
  • 打赏
  • 举报
回复
学习一下
llsen 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 sandyxxx 的回复:]
你去研究petshop4.0就基本都懂了
讲程序语言的书上是没有分层的知识的

DAL --数据层,只负责数据的增删改查

BLL--商业逻辑,负责商业逻辑处理,处理好的数据是数据库直接能接受的数据,还有往显示层传送数据,它数据层和显示层中间,起承上启下的作用

UI---就是现实层,你输入数据,和从数据库取出数据都要这里呈现

Model--实体类,基本就是映射你数据库的表,数据库的一行生成一个相应的类的对象,
实体类负…
[/Quote]

就是这个了
Roc_Lee 2009-04-22
  • 打赏
  • 举报
回复
DAL数据访问
BLL业务逻辑
UI界面

这就是三层 :
DAL专注于数据库方面的操作。增删改查都在这里执行
BLL专注于业务逻辑方面的操作。通常的比较了。合并了。。。都在这里操作。
UI专注于页面,相关操作直接调用BLL中的结果即可

目的:
想达到的目的还是分离。
数据库大拿可以专注于数据库部分的封装。
而UI设计可以专注于绑定相关操作。
互不影响。
当然这个需要PM以及AT的相关详细设计。
beargo 2009-04-22
  • 打赏
  • 举报
回复
接触.NET有一两年了???应该知道怎么制作一个DLL吧??在另一个项目中如何引用并调用你制作那个DLL吧??先别说多少层,如果你知道怎么制作一个DLL并在另一个项目中如何引用和调用,你把DLL理解为一层就OK了.三层的意思最简单的理解就是你开发三个DLL.分别为a.dll,b.dll,c.dll 然后三个的关系是a.dll->b.dll->c.dll. a.dll要调用c.dll必须通过b.dll去调用c.dll,反之.c.dll要返回结果一样是必须通过b.dll才返回给a.dll.
beargo 2009-04-22
  • 打赏
  • 举报
回复
接触.NET有一两年了???应该知道怎么制作一个DLL吧??在另一个项目中如何引用并调用你制作那个DLL吧??先别说多少层,如果你知道怎么制作一个DLL并在另一个项目中如何引用和调用,你把DLL理解为一层就OK了.三层的意思最简单的理解就是你开发三个DLL.分别为a.dll,b.dll,c.dll 然后三个的关系是a.dll->b.dll->c.dll. a.dll要调用c.dll必须通过b.dll去调用c.dll,反之.c.dll要返回结果一样是必须通过b.dll才返回给a.dll.
culmer 2009-04-22
  • 打赏
  • 举报
回复
直接学学asp.net mvc吧,里面分的比较详细,这个了解一些以后三层也就差不多了.微软的web cast上有一部比较详细的asp.net mvc的视频,适合初学者,我也正在学习这个.建议你下一套看看,虽然现在还剩三四集没出.
fancycgx3650 2009-04-22
  • 打赏
  • 举报
回复
mark
wartim 2009-04-22
  • 打赏
  • 举报
回复
只是例子,没有封装成类什么的
加载更多回复(21)

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧