七层--愈见清晰明了

前言

      之前三层的时候,自己好像是清楚,好像又糊涂。从三层到七层,加上了抽象工厂,反射和外观层,期间的辛酸好像蛮多的,但是还想着如何自己真的完成了会怎样怎样的,其实呢,都是对未知的恐惧,从三层到七层,就是一次次的尝试和一次次的思考。


分析

      这是三层的一个简单的示意图:
这里写图片描述
这是一个七层的示意图:
这里写图片描述
这里简单说一下他们的职责是什么:

  • 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()
        {

        }
}

结语

这是一个简单的一条线,我相信,有了一条线,通了一条线,之后会越走越顺的。我们还是要思考每层的作用,体会我们这门这样实现功能的好处是什么?

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 39
    评论
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值