zoukankan      html  css  js  c++  java
  • RoadFlow开源工作流源码-项目架构分析

    项目文件结构:

            

    很明了一个标准的三层架构的系统。

    表示层:Web

    业务层:Business

    数据访问层:Data

    另外存在缓存层:Cache缓存

    增加公共使用类库:Utility

    下面以一个实例(系统登陆为例)来讲解各层之间如何调用:

    系统登陆界面跳到Login1.aspx页面。

    查看后面登陆界面代码,当点击登陆按钮时页面会触发Page_Load事件,然后判断是IsPostBack时,表示是提交的登陆按钮操作时,调用check方法来验证登陆信息。

    protected void Page_Load(object sender, EventArgse)

           {

               if (IsPostBack)

               {

                    check();

               }

           }

    然后看下check方法的代码。

     /////////////////////////////表示层调用业务层代码/////////////////////////////////////////

                // RoadFlow.Platform.Users这里先调用业务层的对象RoadFlow.Platform.Users

    RoadFlow.Platform.Users busers = newRoadFlow.Platform.Users();

    //业务层调用的是GetByAccount方法

                    var user =busers.GetByAccount(account.Trim());

                    if (user == null ||string.Compare(user.Password, busers.GetUserEncryptionPassword(user.ID.ToString(),password.Trim()), false) != 0)

                    {

                        Session[isVcodeSessionKey]= "1";

                       RoadFlow.Platform.Log.Add("用户登录失败",string.Concat("用户:", account, "登录失败,帐号或密码错误"),RoadFlow.Platform.Log.Types.用户登录);

                        Script = "alert('帐号或密码错误!');";

                    }

     ////////////////////////////业务层代码///////////////////////////////////////////////

    /// <summary>

           /// 根据帐号查询一条记录

           /// </summary>

           public RoadFlow.Data.Model.Users GetByAccount(string account)

           {

               return account.IsNullOrEmpty() ? null : dataUsers.GetByAccount(account);//业务层调用数据访问层代码

           }

    ////////////////////////////访问层代码///////////////////////////////////////////////

             IUser接口

    /// <summary>

           /// 根据帐号查询一条记录

           /// </summary>

           RoadFlow.Data.Model.Users GetByAccount(string account);

    RoadFlow.Data.Factory

    通过工厂模式来调用数据访问层具体类,如MSSQL类,以后要扩展其它数据库请重写此类扩展多数据库,如增加Data.Oracle数据访问层,然后工厂方法调return new Data.Oracle.Users()。现在代码是调用的MYSQL数据库访问层具体实现类。

    public static Data.Interface.IUsersGetUsers()

           {

               return new Data.MSSQL.Users();

           }

    RoadFlow.Data.MSSQL实现代码

    /// <summary>

           /// 根据帐号查询一条记录

           /// </summary>

           public RoadFlow.Data.Model.Users GetByAccount(string account)

           {

               string sql = "SELECT * FROM Users WHERE Account=@Account";

               SqlParameter[] parameters = new SqlParameter[]{

                                         newSqlParameter("@Account", SqlDbType.VarChar, 255){ Value = account }

                                };

               SqlDataReader dataReader = dbHelper.GetDataReader(sql, parameters);

               List<RoadFlow.Data.Model.Users> List =DataReaderToList(dataReader);

               dataReader.Close();

               return List.Count > 0 ? List[0] : null;

           }

    这样就完成了表示层访问数据库的整个流程,可能在查询数据时在业务层会增加从缓存中查询数据,这样就不从数据库查,如果缓存不存在即从数据库查询,减轻数据库的负担。但这样对调试不方便,每次要调试有缓存的代码需要半闭IE,重新启动调试。

  • 相关阅读:
    wxPython跨线程调用
    安卓开发24:FrameLayout布局
    URAL 1081
    [置顶] Hibernate运行机理
    [置顶] Hibernate的一个经典异常
    poj1190 生日蛋糕 dfs
    [置顶] 自己写代码生成器之生成Dal层代码(获取数据库所有表名称)
    修改mysql数据存储的地址
    拖延心理学
    DeepLearnToolbox使用总结
  • 原文地址:https://www.cnblogs.com/Jeely/p/11262049.html
Copyright © 2011-2022 走看看