解读ASP.NET TimeTracker Starter Kit(2)——重构篇

原创 2005年04月26日 20:13:00

看了ASP.NET Time Tracker Starter Kit的代码以后,觉得这个程序是学习面向对象编程开发的一个好案例。整个程序从功能上来讲就是记录人员参加项目工作的工时记录。分析得出主要有人员、项目、工时记录这几个类。整个程序正好是以这几个类为基础展开的。在业务逻辑层里TTUser(用户类)、Project(项目类)和TimeEntry(工时记录类)分别就包括了对相应表的增、删、改等操作和整个程序中所用到的对这几个主要对象的各种操作。整个程序在类的划分和功能上做的很好,但是我觉得在三层架构的划分上不是很理想。

业务逻辑层包含的许多数据访问层的东西,如:数据库连接信息、用到的存储过程等。而这些信息我觉得放在数据访问层应该会更好一些。作为数据访问层,应该为数据逻辑层提供访问数据库的方法,而不是只提供一个简化数据访问的组件(DAAB)。假设要使用Oracle数据,那么改动的代码就需要改动很多,同时也不利于将来的改动。

我的想法是:彻底的将与数据相关的操作从数据逻辑层分离出去,对数据访问层只提供访问方法。在数据访问层的设计上,还是沿用“为数据访问层编写一个基类”的方法,通过基类访问DAAB。这样一来如果要变换为Oracle数据库,只要修改DAAB中的内容即可。大家帮忙看看我的改进代码,看看思路有无问题。
数据访问层基类:
using System;
using System.Data;
//数据访问组件(用的微软提供的)
using MyStarterKit.DDAB;

namespace MyStarterKit.TimeTracker.DAL
{
 /// <summary>
 /// DALBase 的摘要说明。
 /// 数据访问层积累
 /// </summary>
 public class DALBase
 {
  //数据库连接字符串
  private string CONNSTR = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];

  public DALBase()
  {
  }

  /// <summary>
  /// 返回一个单值
  /// </summary>
  /// <param name="commandText"></param>
  /// <param name="parameterValues"></param>
  /// <returns></returns>
  protected object ExecuteScalar(string commandText, params object[] parameterValues)
  {
   return SqlHelper.ExecuteScalar(CONNSTR, commandText, parameterValues);
  }

  /// <summary>
  /// 执行无返回值操作
  /// </summary>
  /// <param name="commandText"></param>
  /// <param name="parameterValues"></param>
  protected void ExecuteNonQuery(string commandText, params object[] parameterValues)
  {
   SqlHelper.ExecuteNonQuery(CONNSTR, commandText, parameterValues);
  }

  /// <summary>
  /// 返回DataSet
  /// </summary>
  /// <param name="commandText"></param>
  /// <param name="parameterValues"></param>
  /// <returns></returns>
  protected DataSet ExecuteDataset(string commandText, params object[] parameterValues)
  {
   return SqlHelper.ExecuteDataset(CONNSTR, commandText, parameterValues);
  }
 }
}

数据访问层代码:(以项目类数据访问层代码为例)
using System;
using System.Data;

namespace MyStarterKit.TimeTracker.DAL
{
 /// <summary>
 /// Project 的摘要说明。
 /// 项目信息类(数据访问层代码)
 /// </summary>
 public class Project : DALBase
 {
  public Project()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }

  /// <summary>
  /// 获取全部的项目列表
  /// </summary>
  /// <returns></returns>
  public DataSet GetAllProjects()
  {
   return base.ExecuteDataset("TT_ListAllProjects");
  }

  /// <summary>
  /// 获取项目列表
  /// </summary>
  /// <param name="parameterValues"></param>
  /// <returns></returns>
  public DataSet GetProjects(params object[] parameterValues)
  {
   return base.ExecuteDataset("TT_ListProjects",parameterValues);
  }

  /// <summary>
  /// 删除项目
  /// </summary>
  /// <param name="parameterValues"></param>
  public void Remove(params object[] parameterValues)
  {
   base.ExecuteNonQuery("TT_DeleteProject",parameterValues);
  }

  /// <summary>
  /// 更新项目
  /// </summary>
  /// <param name="parameterValues"></param>
  public void Update(params object[] parameterValues)
  {
   base.ExecuteNonQuery("TT_UpdateProject",parameterValues);
  }

  /// <summary>
  /// 新增项目
  /// </summary>
  /// <param name="parameterValues"></param>
  /// <returns>新项目的Id</returns>
  public int Insert(params object[] parameterValues)
  {
   return Convert.ToInt32(base.ExecuteScalar("TT_AddProject",parameterValues));
  }

 }
}
业务逻辑层代码:(以项目类业务逻辑层代码为例)
/// <summary>
/// 根据用户和用户角色,获取指定用户能够查看的项目列表
/// </summary>
/// <param name="userID"></param>
/// <param name="role"></param>
/// <returns></returns>
public static ProjectsCollection GetProjects(int userID, string role)
{
 string firstName = string.Empty;
 string lastName = string.Empty;
 // 创建数据访问层类
 DAL.Project project = new DAL.Project();
 // 调用数据访问层方法
 DataSet ds = project.GetProjects(userID, Convert.ToInt32(role));
 ProjectsCollection projects = new ProjectsCollection();
 foreach(DataRow r in ds.Tables[0].Rows)
 {
  Project prj = new Project();
  prj.ProjectID = Convert.ToInt32(r["ProjectID"]);
  prj.Name = r["ProjectName"].ToString();
  prj.Description = r["Description"].ToString();
  prj.ManagerUserID = Convert.ToInt32(r["ManagerUserID"]);
  prj.ManagerUserName = TTUser.GetDisplayName(Convert.ToString(r["UserName"]), ref firstName, ref lastName);
  prj.EstCompletionDate = Convert.ToDateTime(r["EstCompletionDate"]);
  prj.EstDuration = Convert.ToDecimal(r["EstDuration"]);
  projects.Add(prj);
 }
 return projects;
}

更多相关内容:点击这里>> 

解读ASP.NET TimeTracker Starter Kit(1)——数据库篇

初步了解了ASP.NET Portal Starter Kit后(我以前的文章),本来想继续重构代码的。在构思的时候想到要是能把五个入门套件结合在一起不是更好。Time Tracker(时间管理或项目...
  • esshs
  • esshs
  • 2005年04月25日 18:40
  • 1087

解读ASP.NET Portal Starter Kit(2)——用户配置文件篇

ASP.NET Portal Starter Kit将网站所需的配置信息都存储在一个XML配置文件(PortalCfg.xml)中。这些配置信息控制门户内容的布局(如:显示哪些门户的标签,每个标签上显...
  • esshs
  • esshs
  • 2005年04月15日 14:30
  • 917

解读ASP.NET Portal Starter Kit(2)——用户配置文件篇

  ASP.NET Portal Starter Kit将网站所需的配置信息都存储在一个XML配置文件(PortalCfg.xml)中。这些配置信息控制门户内容的布局(如:显示哪些门户的标签,每个标签...
  • webplat
  • webplat
  • 2006年08月17日 09:31
  • 875

Google 的 Web Starter Kit

Web Starer Kit (GitHub: google / web-starter-kit   License: Apache 2.0) 是一个来自Google的构建响应式网站的模板。支持不...
  • u012364961
  • u012364961
  • 2014年07月06日 11:37
  • 529

AM335X Starter Kit Android 开发环境搭建

硬件平台:AM335X Starter Kit Android 开发源码包下载地址:TI-Android-ICS-4.0.3-DevKit-EVM-SK-3.0.1.bin   安装空间大...
  • wu20093346
  • wu20093346
  • 2014年12月09日 17:40
  • 1832

解读ASP.NET Portal Starter Kit(3)——代码文件篇

了解了ASP.NET Portal Starter Kit的数据库和用户配置文件后,看一看程序各代码是实现什么样的功能,我想也是很有必要的。下表列举了项目包含的文件清单并给出了说明。没什么技术上的东西...
  • esshs
  • esshs
  • 2005年04月16日 08:19
  • 943

解读ASP.NET Portal Starter Kit(1)——数据库篇

  ASP.NET Portal Starter Kit数据库结构总体上来讲是由网站引擎的核心表(用户表、角色表和角色关系表)和各个用户模块相关的表组成。核心表存储整个网站的用户权限的配置信息(详细的...
  • webplat
  • webplat
  • 2006年08月17日 09:17
  • 779

解读ASP.NET Portal Starter Kit(4)——角色身份认证篇

ASP.NET Portal Starter Kit是采用的“基于窗体的身份验证”的身份验证模式。Forms 身份验证通常指这样一个系统,在该系统中使用 HTTP 客户端重定向将未经身份验证的请求重定...
  • webplat
  • webplat
  • 2006年08月17日 09:50
  • 774

解读ASP.NET Portal Starter Kit(3)——代码文件篇

了解了ASP.NET Portal Starter Kit的数据库和用户配置文件后,看一看程序各代码是实现什么样的功能,我想也是很有必要的。下表列举了项目包含的文件清单并给出了说明。没什么技术上的东西...
  • webplat
  • webplat
  • 2006年08月17日 09:34
  • 693

基于DragonBoard 410c的Grove Starter Kit体验系列之环境构建

一.Grove Starter Kit介绍 Grove Starter Kit是Qualcomm公司为Dragonbaord410c开发板量身订制的96board制式传感器开发套件,里面包括了丰富的传...
  • ad3600
  • ad3600
  • 2017年03月02日 18:15
  • 304
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解读ASP.NET TimeTracker Starter Kit(2)——重构篇
举报原因:
原因补充:

(最多只允许输入30个字)