实体类是现实实体在计算机中的表示。比如一个人就是一个实体。当然,你也可以认为一扒屎是一个实体。我没意见的。
它贯穿于整个架构,负担着在各层次及模块间传递数据的职责。大多情况下,实体类和数据库中的表(这里指实体表,不包括表示多对多对应的关系表)是一一对应的,但这并不是一个限制。
比如我们的数据库中有个表User。我们就可以在项目中创建User的实体类,这个类的一个实例化对象就表示一个User。
上一篇博文提到的各层返回值的规范问题,就可以利用返回一个实体(或者实体的泛型集合)来实现。如果返回的实体有问题,就会在编译的时候给出错误提示。
实体类存放在Model或者Entity层中,那俩单词都表示实体。这里我们使用Model。
新建一个项目,命名为Model,并新建一个类,类名为UserInfo.cs。
这里我们再复习一下表User的字段。
将这些字段全部作为UserInfo实体类的属性。
UserInfo的内容如下:
using System;
namespace Model
{
/// <summary>
/// 表示用户信息的实体类
/// </summary>
public class UserInfo
{
private int userId;
private string password;
private bool isAdmin;
private string userName;
private bool sex;
private Int16 age;
/// <summary>
/// 默认的构造函数
/// </summary>
public UserInfo() { }
/// <summary>
/// 带参的构造函数
/// </summary>
/// <param name="userId">用户Id</param>
/// <param name="password">用户密码</param>
/// <param name="isAdmin">是否为管理员</param>
/// <param name="userName">用户名</param>
/// <param name="sex">用户性别</param>
/// <param name="age">用户年龄</param>
public UserInfo(int userId, string password, bool isAdmin, string userName, bool sex, Int16 age)
{
this.userId = userId;
this.password = password;
this.isAdmin = isAdmin;
this.userName = userName;
this.sex = sex;
this.age = age;
}
public int UserId
{
get { return userId; }
set { userId = value; }
}
public string Password
{
get { return password; }
set { password = value; }
}
public bool IsAdmin
{
get { return isAdmin; }
set { isAdmin = value; }
}
public string UserName
{
get { return userName; }
set { userName = value; }
}
public bool Sex
{
get { return sex; }
set { sex = value; }
}
public Int16 Age
{
get { return age; }
set { age = value; }
}
}
}
DAL中的User.cs:
using System.Data;
using System.Data.SqlClient;
using DBUtility;
using Model;
namespace DAL
{
public class User
{
private const string SQL_SELECT_USERINFO_BY_USERID = "SELECT * FROM [User] WHERE UserId = @UserId";
private const string PARM_USERID = "@UserId";
/// <summary>
/// 根据用户Id获取用户信息
/// </summary>
/// <param name="userId">用户Id</param>
/// <returns>用户信息</returns>
public UserInfo GetUserInfo(string userId)
{
UserInfo user = null;
SqlParameter parm = new SqlParameter(PARM_USERID, SqlDbType.VarChar, 10);//参数UserId
parm.Value = userId;//给参数赋值
using (SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_SELECT_USERINFO_BY_USERID, parm))
{
if (rdr.Read())
{
user = new UserInfo(rdr.GetInt32(0), rdr.GetString(1), rdr.GetBoolean(2), rdr.GetString(3), rdr.GetBoolean(4), rdr.GetInt16(5));
}
else user = new UserInfo();
}
return user;
}
}
}
BLL中的User.cs:
namespace BLL
{
public class User
{
DAL.User user = new DAL.User();
/// <summary>
/// 根据用户Id获取用户密码
/// </summary>
/// <param name="userId">用户Id</param>
/// <returns>用户密码</returns>
public string GetUserPassword(string userId)
{
return user.GetUserInfo(userId).Password;
}
/// <summary>
/// 根据用户Id获取用户姓名
/// </summary>
/// <param name="userId">用户Id</param>
/// <returns>用户姓名</returns>
public string GetUserName(string userId)
{
return user.GetUserInfo(userId).UserName;
}
}
}
可见,DAL中的User.cs只剩下一个方法。返回值是UserInfo类型的。这样就保证了层与层之间数据的传输规范。
到目前为止,三层结构基本上是建好了。还有什么欠缺的么。如果有一天,Boss觉得SQL Server不爽,想用Oracle或者是MySQL或者是Access的时候怎么办呢。更换数据库可不是小事哟,会叫人精尽而亡的。
有没有办法对这种情况进行预防呢。
具体怎么做请看下一篇博文:ASP.NET三层结构演化构建之五——啥都能用。