项目文件结构:

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

表示层: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,重新启动调试。

RoadFlow开源工作流源码-项目架构分析的更多相关文章

  1. leveldb 源码--总体架构分析

    一 本文目的 对leveldb的总体设计框架分析(关于leveldb基本原理,此文不做阐述,读者可以自行检索文章阅读即可),对leveldb中底层数据存储数据格式,内存数据模型,compact,版本管 ...

  2. Atitit 项目源码的架构,框架,配置与环境说明模板 规范 标准化

    Atitit 项目源码的架构,框架,配置与环境说明模板  规范 标准化 版本1.0 作者 艾龙 attilax 1. 概述:核心业务: 1 1.1. 功能文档路径 /palmWin/src/docum ...

  3. qt creator源码全方面分析(3-5)

    目录 qtcreatorlibrary.pri 使用实例 上半部 下半部 结果 qtcreatorlibrary.pri 上一章节,我们介绍了src.pro,这里乘此机会,把src目录下的所有项目文件 ...

  4. 从源码的角度分析ViewGruop的事件分发

    从源码的角度分析ViewGruop的事件分发. 首先我们来探讨一下,什么是ViewGroup?它和普通的View有什么区别? 顾名思义,ViewGroup就是一组View的集合,它包含很多的子View ...

  5. 百度智能手环方案开源(含源码,原理图,APP,通信协议等)

    分享一个百度智能手环开源项目的设计方案资料. 项目简介 百度云智能手环的开源方案是基于Apache2.0开源协议,开源内容包括硬件设计文档,原理图.ROM.通讯协议在内的全套方案,同时开放APP和云服 ...

  6. qt creator源码全方面分析(3-3)

    目录 qtcreatordata.pri 定义stripStaticBase替换函数 设置自定义编译和安装 QMAKE_EXTRA_COMPILERS Adding Compilers 示例1 示例2 ...

  7. NetBSD是个开源到源码的系统

    How to get NetBSD NetBSD is an Open Source operating system, and as such it is freely available for ...

  8. 安卓图表引擎AChartEngine(二) - 示例源码概述和分析

    首先看一下示例中类之间的关系: 1. ChartDemo这个类是整个应用程序的入口,运行之后的效果显示一个list. 2. IDemoChart接口,这个接口定义了三个方法, getName()返回值 ...

  9. java基础解析系列(十)---ArrayList和LinkedList源码及使用分析

    java基础解析系列(十)---ArrayList和LinkedList源码及使用分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder jav ...

随机推荐

  1. thinkphp IP获取和定位

    系统内置了get_client_ip方法用于获取客户端的IP地址,使用示例: $ip = get_client_ip(); 如果要支持IP定位功能,需要使用扩展类库Org\Net\IpLocation ...

  2. HTML之web项目的目录结构

    文件夹树注解 htmls    html一个文件放除去index.html外的其他页面文件. imgs    存放所有的图片文件:.png..jpg..jpeg.壁纸等. 示例:icon.png.ho ...

  3. 经典排序背包——cf1203F

    先把收益为正数的处理掉:策略是挨个扫,扫n遍,碰到能买的就买,然后可以得到一个更新后的r 剩下的就看做是一个背包模型:物品(a,b)表示当背包体积>a时才能装下体积为b的该物品,问最多装几个 无 ...

  4. 谈html mailto(电子邮件)实际应用

    大家知道,mailto是网页设计制作中的一个非常实用的html标签,许多拥有个人网页的朋友都喜欢在网站的醒目位置处写上自己的电子邮件地址,当点击时就能自动打开当前计算机系统中默认的电子邮件客户端软件, ...

  5. CSS:CSS 分组 和 嵌套 选择器

    ylbtech-CSS:CSS 分组 和 嵌套 选择器 1.返回顶部 1. CSS 分组 和 嵌套 选择器 Grouping Selectors 在样式表中有很多具有相同样式的元素. h1 { col ...

  6. hive调用MapReduce之后遇到kill command之后卡住或者一直开在MapReduce之前

    https://blog.csdn.net/weixin_42158422/article/details/88876943

  7. MarkDown 快速开始 基础教学

    # MarkDown 快速上手 # > [源代码](https://www.cnblogs.com/qiyuexin/p/9932941.html) > by qyx@2018/11/07 ...

  8. JAVA单元测试的用法和要点(入门篇)

    一.单元测试的目的?      单元测试是编写测试代码,用以检测特定的.明确的.细颗粒的功能!  严格来说,单元测试只针对功能点进行测试,不包括对业务流程正确性的测试.现在一般公司都会进行业务流程的测 ...

  9. JMeter AI图片识别接口并发量测试

    由于临时接到一个性能测试任务,测试8个独立接口在实验室环境的TPS.响应时间以及服务器性能监控如CPU.内存.IO等,没有明确具体的响应时间与并发数,需求较模糊. 1.软件.硬件环境信息:JMeter ...

  10. 商城sku的选择功能--客户端

    前段时间,刚好做到了有关sku这个功能.客户端的sku,和后台管理系统的sku.当初查了大量资料,遂做个记录,以免忘记. 这篇先写客户端的sku功能把,类似于去淘宝京东等购物,就会有个规格让你选择.如 ...