前记
当初刚敲完登陆的时候,和前辈说总感觉少点什么,前辈建议:把以后的窗体再敲敲就有感觉了。Then I do that,然后就发现在以后的重复中,对七层结构有了更深一层的理解。
现在把登陆总结如下。
正文
这是敲七层的顺序图,至于具体是怎么传递的,请看小编上篇博客。
在电梯中生成苹果——Entity
using System.Threading.Tasks;//表明程序使用的是给定命名空间的名称
namespace Entity
{
public class LoginEntity//声明类LoginEntity
{
public string txtName { get; set; }//定义用户名为字符串类型。拥有读写的功能。
public string txtPWD { get; set; }
}
}
在实体层中写入的是需要传递的值,比如在登录中,需要将用户输入的登录名和密码值传进系统,所以要将这两项在实体层定义出来。
其实小编上段的第一句是不准确的,在三层中并不是传参值,而是传实体。其有什么区别呢?
假如出现这么一种情况,数据库里面增加了3个字段4 5 6,那么代码将做如下从【原始代码】到【如今代码】的改变:
原始代码 | 如今代码 | |
传参数 | update(字段1,字段2,字段3) | update(字段1,字段2,字段3,字段4,字段5,字段6) |
传实体 | update(model) | update(model) |
可见,传实体能解耦合。
接口层——IDAL
using System.Data;
using System.Data.SqlClient;
namespace IDAL
{
public interface LoginIDAL
{
DataTable login(Entity.LoginEntity loginEntity);
//C#定义接口与VB不同。
}
}
数据访问层——DAL
using System.Data;
using System.Data.SqlClient;
using System.Configuration;//布局
namespace DAL
{
public class LoginDAL:IDAL.LoginIDAL
{
public DataTable login(Entity.LoginEntity loginEntity)
{
CommandType Text = 0;//枚举,SQL文本命令
SqlHelper sqlHelper = new SqlHelper();//实例化
SqlParameter[] sqlParams = {
new SqlParameter("@UserID", loginEntity.txtName), //userID是数据库中表的内容,txtName是本项目中相应控件名称
new SqlParameter("@PWD", loginEntity.txtPWD)
};
//这是一个类,命名空间为System.Data.SqlClient。
string sql = @"SELECT * FROM [tb_User] WHERE userID=@UserID and PWD =@PWD";
DataTable table = sqlHelper.ExecuteNonQuery(sql, Text, sqlParams);//ExecuteNonQuery方法
return table;
}
}
}
外观层——factory
using System.Configuration; //对配置文件进行引用
using System.Reflection; //对反射引用
using IDAL; //引用接口
namespace Factory
{
public class LoginFactory
{
//选择数据库,通过配置文件给DB赋值
string DB = System.Configuration.ConfigurationManager.AppSettings["DB"];
//支持运行时 1.0 和 1.1 版中读取配置节和公用配置设置
public LoginIDAL CreateUserInfo()
{
//C#中强制类型转换,在C#中没有Ctype函数
LoginIDAL Iuser = (LoginIDAL)Assembly.Load("LoginDAL").CreateInstance("Login.DAL" + "." + "UserDAO");
return Iuser;
}
}
}
小结
未完待续