各个层的定义又是如何呢?
每个层里都需要实现什么功能,放哪些代码呢?
这些好像都并不是很明确。
常常可以看到两个人(或多个人)讨论的很激烈,但是到最后才发现其实讨论的的东东并不完全一致。虽然都是用了数据访问层(或是逻辑层)的名词,但是各自的理解却是不一样的。
大家在理论上的讨论比较多,但是具体到一个实例上的却比较少,有的话也是个说各的,不够统一,影响理解。
这里本人斗胆,定了一个命题,邀请各路高手针对这个实例来讨论一下,如何划分层次,哪些代码应该放在哪些层里面等问题。
谢谢大家的帮忙。
题目很简单 —— 实现一个添加数据的功能。
说明:简单,才可以更明晰、快速一些,让更多的人更容易地看懂。
简单的都没有分清楚的话,复杂的就更晕了呀。:)
环境介绍
IDE:vs2003
语言方面:asp.net 1.0、ADO.NET 1.0、
数据库:Server SQL 2000
实现的功能:项目里的一个简单但是很常用的功能 —— 填加数据。再具体一点,新闻系统里的添加新闻的功能。(注意:只是添加新闻,不包括显示数据等功能)。具体一点可以更有的放矢。
数据库说明:
新闻表(LayerDemo_News)
字段暂时定义为:
ID:NewsID (数据库自动生成)
标题Title、 (用户添加)
分类(一级分类)ClassID、(用户添加)
编辑Editer、(用户添加)
内容Content、(用户添加)
发布时间AddedDate、数据库自动生成)
人气Hits。(数据库自动生成。默认值:0)
这里要添加四个字段。
下面按照完全“一层”的方式来编写代码。不能使用自定义的类。
(代码会比较长,所以这里并不会写全,只写出说明和主要的代码。其实也没有必要写全嘛。呵呵)
为了说明的方便,给代码加上一个标识J 主要讨论 A部分之外的部分。
//===============A部分 aspx页面里的代码==============
这个就不写代码了,绘制一些文本框,下拉列表之类得控件了。还有格式之类的事情
另外还要写一些js脚本来验证数据。(偷懒的话也可以不写)
//====结束====
这个就不写代码了,绘制一些文本框,下拉列表之类得控件了。还有格式之类的事情
另外还要写一些js脚本来验证数据。(偷懒的话也可以不写)
//====结束====
// aspx.cs页面里的代码。这里面要再细分一下。
//另外说明一下,下面的代码都会写在“保存按钮”的点击事件里面。
//==================B部分 获取新闻信息==============
定义变量,获取用户添加的新闻信息,同时去掉两端的空格,并且过滤“’”
例如:string NewsTitle = this.Txt_Title.Text.Trim().Replace(“‘”,””);
其他省略
代码行数:大于等于字段数(>= 4)。
//====结束====
定义变量,获取用户添加的新闻信息,同时去掉两端的空格,并且过滤“’”
例如:string NewsTitle = this.Txt_Title.Text.Trim().Replace(“‘”,””);
其他省略
代码行数:大于等于字段数(>= 4)。
//====结束====
//==================C部分 验证数据==============
这里要做一些安全验证和逻辑验证,比如新闻标题不能为空、是否重复之类。
安全验证一个要处理“‘”,另一个就是,如果字段类型是数字的就要验证是否是数字了。
(本着不能相信页面传过来的数据的原则,一些信息还要重复验证一遍,呵呵)
如果数据不合格,要给用户显示提示信息,并且终止事件的继续执行。
如果数据合格继续执行。
具体代码略。
代码行数:大于4行,小于 不详。根据实际情况来决定,这里就不好确定了。
//====结束====
这里要做一些安全验证和逻辑验证,比如新闻标题不能为空、是否重复之类。
安全验证一个要处理“‘”,另一个就是,如果字段类型是数字的就要验证是否是数字了。
(本着不能相信页面传过来的数据的原则,一些信息还要重复验证一遍,呵呵)
如果数据不合格,要给用户显示提示信息,并且终止事件的继续执行。
如果数据合格继续执行。
具体代码略。
代码行数:大于4行,小于 不详。根据实际情况来决定,这里就不好确定了。
//====结束====
//==================D 部分 填写数据==============
数据验证完毕,可以写到数据库里面了。
这里就有个分支了。基本上可以分为三种情况:组合Insert into 语句、使用带参数的Insert into 语句、存储过程。
不管用哪种方法,都要先定义一个Connection 对象和一个command 对象。其他得根据情况来定了。
SqlConnection cn = new SqlConnection(…);
SqlCommand cm = new SqlCommand
(使用的是一层的方式,所以需要写出Connection之类的代码)
组合Insert into 语句 :行数会比较少,但是很不易读,一些人也会说不太安全。
带参数的Insert into 语句:行数会比较多;需要一个长一点的SQL语句,需要一个存储过程的参数的数组,并且赋值;比较安全。
存储过程:行数和带参数的方式基本一样;需要在数据库里编写一个存储过程,需要一个存储过程的参数的数组,并且赋值;很安全。
具体代码略。
代码行数是少不了,基本上会比添加字段数的两倍还要多一些。
//====结束====
数据验证完毕,可以写到数据库里面了。
这里就有个分支了。基本上可以分为三种情况:组合Insert into 语句、使用带参数的Insert into 语句、存储过程。
不管用哪种方法,都要先定义一个Connection 对象和一个command 对象。其他得根据情况来定了。
SqlConnection cn = new SqlConnection(…);
SqlCommand cm = new SqlCommand
(使用的是一层的方式,所以需要写出Connection之类的代码)
组合Insert into 语句 :行数会比较少,但是很不易读,一些人也会说不太安全。
带参数的Insert into 语句:行数会比较多;需要一个长一点的SQL语句,需要一个存储过程的参数的数组,并且赋值;比较安全。
存储过程:行数和带参数的方式基本一样;需要在数据库里编写一个存储过程,需要一个存储过程的参数的数组,并且赋值;很安全。
具体代码略。
代码行数是少不了,基本上会比添加字段数的两倍还要多一些。
//====结束====
//==================E部分 异常判断==============
往数据库里添加数据要做一下异常的判断,用 try 的方式,要套在 D部分的代码的外面。
如果发生异常了要给出说明(针对程序员的说明,和针对用户的说明两种),
对程序员的要尽量详细地说明出错的地方和出错信息,以便于程序员能够尽快修改错误;
对客户的就要友好一些了。
具体代码略。
没有异常的话要给出添加信息成功的提示。
//====结束====
往数据库里添加数据要做一下异常的判断,用 try 的方式,要套在 D部分的代码的外面。
如果发生异常了要给出说明(针对程序员的说明,和针对用户的说明两种),
对程序员的要尽量详细地说明出错的地方和出错信息,以便于程序员能够尽快修改错误;
对客户的就要友好一些了。
具体代码略。
没有异常的话要给出添加信息成功的提示。
//====结束====
基本上填加数据的工作就完成了,当然这里只是一个部分,实际中还会再加一些代码。先以这些为准吧。
(如果您感觉我写的代码不对,也欢迎您拍板砖。)
那么请各位高手帮帮忙,对于这个实例,您会如何分层呢?或者说怎么拆分这一大段代码呢?
http://community.csdn.net/Expert/TopicView3.asp?id=4957543
这是 csdn 里的帖子,也希望各位高手能到csdn里面回个帖子,帮助大家一下,毕竟还有很多人对于三层还不是很了解(包括我在内),希望高手可以结合这个实例,用最简洁的语言讲解一下,再次谢谢!