前言
之前三层的时候,自己好像是清楚,好像又糊涂。从三层到七层,加上了抽象工厂,反射和外观层,期间的辛酸好像蛮多的,但是还想着如何自己真的完成了会怎样怎样的,其实呢,都是对未知的恐惧,从三层到七层,就是一次次的尝试和一次次的思考。
分析
这是三层的一个简单的示意图:
这是一个七层的示意图:
这里简单说一下他们的职责是什么:
- UI
UI主要负责的是接受用户输入的消息,同时将处理过的信息,显示在界面上,总结一下可以说是负责接受和显示信息。 - Facade
外观层是负责UI和B层之间的信息交流的,为什么要用外观层,还记得设计模式中的基金吗?如果B层和U层之间的要传递的信息特别多,这样U层的负担会很大,怎么办,我们引入外观层,让外观和B层交互,同时外观层,只露出来一个借口给U层,这样的话,U层不必知道B层的存在,轻松的完成任务。 - BLL
B层的作用是访问D层,这里我们为了更换数据库方便些,B层是通过访问工厂,通过反射来间接的调用D层。
当然了,B层还有一个作用使我们不能忽视的,那就是B层要做一些逻辑处理,很多业务逻辑,都是需要在B层做处理的。 - Factory
工厂存在,是生产接口,同时将返回接口。为什么呢?之前问过大师傅,为啥要工厂生产接口?大师傅问我:接口可以实例化吗?我想想也是这个道理。 - Interface
接口层中写了要实现的方法,抽象出来的方法,我们不用给具体的实现,写下这个接口,实现它就好了。 - DAL
数据访问层,所以在D层无需做什么逻辑判断,这是和数据库直接交互的,所以D层中的方法就是增删改查,来操作数据库。别的无需他做,也不必他做。 - Entity
实体层,每层都可以访问,实体层的作用是传递参数,实体会带着参数,游走在各层之间,就像是血液一样,所以我们各层之间产生的交流,实体的作用是不言而喻的。
这是七层的一些职责,我们有的时候敲着敲着就忘了,这样断然是不行的,常常想着每层的职责是什么。
代码展示
我想这里如果没有代码这块一定是不完整的博客,同时也会是遭人骂的博客。下面是自己敲的登陆的一条线,有什么需要提高的,多多指导。
UI
UserName = txtUserName.Text.Trim(); //全局变量
//传递用户输入的参数
string UserID = txtUserName.Text.Trim();
// string PWD = txtUserPWD.Text.Trim();
//定义外观层对象
Facade.LoginFacade loginfacade = new Facade.LoginFacade();
Entity.User userinfo = new Entity.User();
//将文本框的值给实体层对象,让实体层对象带上参数
userinfo.UserID = txtUserName.Text;
userinfo.PassWord = txtUserPWD.Text;
string strResult;
strResult = loginfacade.loginfacade (userinfo);
switch (strResult)
{
case "无用户": MessageBox.Show("用户不存在,请重新输入");
break;
case "登录成功" ://MessageBox.Show("登录成功 ");
this.Visible = false;
}
Facade
/// <summary>
/// 判断用户信息是否有误
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
public string loginfacade(Entity.User user)
{
BLL.QueryBLL ConfirmUserBLL = new BLL.QueryBLL();
return ConfirmUserBLL.UserBll(user);
}
BLL
#region 登录信息查询
public class QueryBLL
{
public string UserBll(Entity.User User)
{
Factory.Factory fact = new Factory.Factory(); //实例化工厂
IDal.ICheck idal = fact.CreateUserInfo(); //调用工厂方法创建接口
IList<Entity.User> user = idal.SelectUser(User);
string flag;
if (user.Count == 0) //返回的datatable类型,如果他的行数等于0,说明没有符合该账号密码的用户
{ flag = "无用户"; }
else
{
if (user[0].PassWord == User.PassWord)
{
flag = "登录成功";
}
else
{
flag = "密码不正确";
}
}
return flag;
}
}
#endregion
Factory
string StrDB = System.Configuration.ConfigurationManager.ConnectionStrings ["DAL"].ToString() ; //接收来自配置文件的数据
public IDal.ICheck CreateUserInfo()
{
string className = StrDB + "." + "QueryDAL";
return (IDal.ICheck)Assembly.Load(StrDB).CreateInstance(className);
}
IDAL
public interface ICheck
{
IList <Entity.User > SelectUser(Entity.User user);
}
DAL
这里Sqlhelper不写了,相信大家都有自己的方法来完成。
class QueryDAL :IDal.ICheck
{
// public DataTable SelectUser(Entity.User User) //之前用的都是datatable
public IList <Entity.User> SelectUser(Entity.User User)
{
//SqlParameter[] sqlParams = { new SqlParameter("@userID", UserInfo.UserID ), new SqlParameter("@pwd", UserInfo.PassWord ) };
SqlParameter[] sqlParams = {new SqlParameter("@userID", User.UserID)};
//string sql ="select * from User_info where UserID=@userID and PassWord=@pwd";
string sql = @"select * from User_info where UserID=@userID";
DataTable table = DAL.sqlhelper.GetDatable(sql, CommandType.Text , sqlParams);
//IList<Entity.User> users =
IList<Entity.User > user = DAL.CovertHelper<Entity.User >.ConvertToModel(table);
return user;
}
}
Entity
定义实体的属性:
namespace Entity
{
public class User
{
public string UserID { set; get; }
public string UserName { set; get; }
public string PassWord { set; get; }
public string Level { set; get; }
public string Head { set; get; }
public User()
{
}
}
结语
这是一个简单的一条线,我相信,有了一条线,通了一条线,之后会越走越顺的。我们还是要思考每层的作用,体会我们这门这样实现功能的好处是什么?