三层架构的理解
经典的三层架构分为BLL,DAL, Model,三层。在使用C#时机编程时,这三层分别作为三个类库来分别编写。三层之间通过添加引用 (using 某类库
)建立联系。
具体为:
BLL层引用DAL层以及Modle层
using DAL;
using Model;
public class Bll
{
//some code
}
DAL层引用Modle层
using Model;
public class DAL
{
//some code
}
Model层处于最底层谁也不引用;
public class Model
{
// some code;
}
下面从下到上说明每一层的作用:
Model层
model层主要作用是声明系统中所有实体。类名大多以实体名命名。
类的内容全部为此对象的一些自实现属性。这些属性反映在数据库中即为一个字段,这些实体即为一张表。
Model层中的定义的实体类是在网页后台代码中按需实例化的,其实例变量也是在网页后台代码中赋值的。比如在网站在注册时可能需要实例化一个Model命名空间下的一个叫的user
对象,user对象的 username 以及 password 字段都是依靠用户的输入来赋值的。上传歌曲的时候则可能需要实例化一个Music
对象,music对象的 musicName,musicStyle等对象内的实例变量也都是在上传时由用户进行赋值的。 赋过值的上述对象则会经由BLL层到达DAL层然后在DAL层提取数据进行数据库操作。
或许可以这样说:Model层在三层架构中充当一个信使的作用(因为总是作为其他两层方法的形参)
public int Id
{
get { return _id; }
set { _id = value; }
}
DAL层
DAL层负责与数据库的交互。在这一层将复杂的数据库操作代码写入一个方法中,比如,在在线音乐平台的例子里,一个基本的删除操作就需要如下的代码:
//读取配置文件中的相关节点信息:数据库连接字符串
string setting = ConfigurationManager.ConnectionStrings["connstring"].ToString();
//创建数据库对象
SqlConnection myconn = new SqlConnection(setting);
//打开连接
myconn.Open();
//创建命令对象,并准备好操作数据库的SQL语句
SqlCommand cmd = new SqlCommand("delect from T_Music where Id=@id", myconn);
//为SQL语句匹配相关参数,并赋值
cmd.Parameters.AddWithValue("@id", model.Id);
//执行相关SQL语句并返回受影响的行数,若受影响行数大于0,则表示执行成功,否者,执行失败
if (cmd.ExecuteNonQuery() > 0)
{
cmd.Dispose();
myconn.Dispose();
return true;
}
else
{
cmd.Dispose();
myconn.Dispose();
return false;
}
在DAL层中,我们就把这些代码封装入一个方法之中,命名为:Delet();
,其他的数据库操作同理,这样就为上层提供了一个相对简明的接口。BLL调用这些方法,获取其返回结果。这些结果可以是bool类型,用以单纯表示数据库操作是否成功(增删改);也可以是DataSet类型,用以向BLL层提交具体的数据(查)。Model层在其中的作用就是形参。
//删
public bool Delete(Model.T_Music model)
{
//读取配置文件中的相关节点信息:数据库连接字符串
string setting = ConfigurationManager.ConnectionStrings["connstring"].ToString();
//创建数据库对象
SqlConnection myconn = new SqlConnection(setting);
//打开连接
myconn.Open();
//创建命令对象,并准备好操作数据库的SQL语句
SqlCommand cmd = new SqlCommand("delect from T_Music where Id=@id", myconn);
//为SQL语句匹配相关参数,并赋值
cmd.Parameters.AddWithValue("@id", model.Id);
//执行相关SQL语句并返回受影响的行数,若受影响行数大于0,则表示执行成功,否者,执行失败
if (cmd.ExecuteNonQuery() > 0)
{
cmd.Dispose();
myconn.Dispose();
return true;
}
else
{
cmd.Dispose();
myconn.Dispose();
return false;
}
}
//查
public DataSet Select(int i)
{
int j = Convert.ToInt32(i);
//读取配置文件中的相关节点信息:数据库连接字符串
string setting = ConfigurationManager.ConnectionStrings["connstring"].ToString();
SqlConnection myconn = new SqlConnection(setting);
myconn.Open();
SqlDataAdapter sda = new SqlDataAdapter("SELECT dbo.T_Music.Id, dbo.T_Music.MusicName, dbo.T_Music.MusicPath,dbo.T_Music.LyricPath FROM dbo.T_Music WHERE dbo.T_Music.Id=" + j + "", myconn);
DataSet ds = new DataSet();
sda.Fill(ds, "T_Music");
sda.Dispose();
myconn.Dispose();
return ds;
}
BLL层
在BLL层中,代码整体看起来要简洁清爽许多,因为它不需要再次编写写复杂的数据库操作代码,这些代码在DAL中已经完成,它只需要调用DAL公开的方法即可(需要生成DAL对象)。对于简单的操作,可以仅仅调用DAL中某一个方法即可。对于一些复杂的查询操作,则需要灵活调用DAL中提供的方法来达到目的。DAL只提供基本的操作,对于更加复杂的操作则可以视作这些基本操作的组合。(当然也可以在DAL中预先定义好)
另外,虽然BLL引用了Model层,然而在BLL层中 Model 并没有生成对象,而只是作为方法的形参来向DAL层传递数据。