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

asp.net

看了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;
}

时间: 2024-10-28 03:23:54

解读ASP.NET TimeTracker Starter Kit(2)——重构篇的相关文章

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

asp.net|数据|数据库 初步了解了ASP.NET Portal Starter Kit后(我以前的文章),本来想继续重构代码的.在构思的时候想到要是能把五个入门套件结合在一起不是更好.Time Tracker(时间管理或项目追踪)是利用微软的Data Access Application Block作为数据库访问层的,我正好也要这样做,所以就先来看看ASP.NET Time Tracker Starter Kit. ASP.NET Time Tracker Starter Kit(项目追踪

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

asp.net|数据|数据库 ASP.NET Portal Starter Kit数据库结构总体上来讲是由网站引擎的核心表(用户表.角色表和角色关系表)和各个用户模块相关的表组成.核心表存储整个网站的用户权限的配置信息(详细的用法及说明将放到<角色身份认证篇>中讲).各用户模块存储各个功能模块的信息.各个用户功能模块表都是独立的.这样有利于新增模块扩展功能.同时也可将各个功能模块的表分别部署到不同的数据库中提高程序的高伸缩性和可扩展性.数据的访问方式是全部通过存储过程进行的.这样做的好处有:1

使用 ASP.NET Community Starter Kit建造网站

asp.net 翻译:刘海东 以下内容翻译自Building Websites with the ASP.NET Community Starter Kit by K. Scott Allen and Cristian Darie for Packt Publishing,以下内容是该书的第8章,详细介绍如何扩展CSK来增加FAQ功能. 如果你想了解 ASP.NET Community Starter Kit的详细信息,可以到www.asp.net浏览和下载,它是一个免费的开源项目.假如你想建造

利用 ASP.NET Starter Kit 即刻开始 Web 站点开发

asp.net|web|站点|asp.net 摘要 如果您要构建 ASP.NET Web 站点,则需要在坚固可靠的代码基础上来开始构建.从一个完整的站点开始,进行一些修改和自定义,然后上线,是不是很棒?ASP.NET Starter Kit 就是一种允许您这样做的打包解决方案.这五个工具包(Community.Reports.Commerce.Portal 和 Time Tracker)提供可重复使用且可易于自定义的完整代码.此外,有许多 ISP 支持对 ASP.NET Starter Kit

ASP.NET 2.0 Club Web Site Starter Kit 补丁

asp.net|web ASP.NET2.0  Club Web Site Starter Kit 具有一个很大的缺陷:不支持中文. 这里给出两种解决方案供大家参考 方法一: 1)由于大家大部分都是用SQL SERVER2005 EXPRESS开发的,所以在建立好Club需要的数据表后,将每一个表的varchar类型更改为nvarchar. 2)将app_code目录下的DataSet.xsd文件里的AnsiString全部替换为String. 就可以解决这个问题. 我花费了大约10分钟找到并修

解读ASP.NET 5 &amp; MVC6系列(1):ASP.NET 5简介

原文:解读ASP.NET 5 & MVC6系列(1):ASP.NET 5简介 ASP.NET 5简介 ASP.NET 5是一个跨时代的改写,所有的功能和模块都进行了独立拆分,做到了彻底解耦.为了这些改写,微软也是蛮 拼的,几乎把.NET Framwrok全部改写了一遍,形成了一个.NET Core的东西. 在.NET Core里一切都是可配置的,包括Session.MVC等功能,而一切可配置的功能都是可以在Nuget上进行下载. 目前ASP.NET 5依旧兼容老的.NET Framwrok,但要

解读ASP.NET 5 &amp; MVC6系列(3):项目发布与部署

原文:解读ASP.NET 5 & MVC6系列(3):项目发布与部署 本章我们将讲解ASP.NET5项目发布部署相关的内容,示例项目以我们前一章创建的BookStore项目为例. 发布前的设置 由于新版ASP.NET5支持多版本DNX运行环境的发布和部署,所以在部署之前,我们需要设定部署的目标DNX(即之前的KRE). 步骤:右键BookStore项目->属性->Application选项卡,选择DNX的版本,本例中,选择dnx-coreclr-win-x64.1.0.0-beta4.

解读ASP.NET 5 &amp; MVC6系列(2):初识项目

原文:解读ASP.NET 5 & MVC6系列(2):初识项目 初识项目 打开VS2015,创建Web项目,选择ASP.NET Web Application,在弹出的窗口里选择ASP.NET 5 Website模板创建项目,图示如下: 我们可以看到,此时Web Forms\MVC\Web API复选框都选择不了,原有是因为在ASP.NET 5中做了大量更改,移除了Web Forms功能,将MVC.Web API.Web Pages这些功能合在了一起,所以自然就不需要这些复选框了.另外由于是CT

解读ASP.NET 5 &amp; MVC6系列(11):Routing路由

原文:解读ASP.NET 5 & MVC6系列(11):Routing路由 新版Routing功能介绍 在ASP.NET 5和MVC6中,Routing功能被全部重写了,虽然用法有些类似,但和之前的Routing原理完全不太一样了,该Routing框架不仅可以支持MVC和Web API,还支持一般的ASP.NET5程序.新版的改变有如下几个部分. 首先,Routing系统是基于ASP.NET 5的,是一个独立于MVC的路由框架,而不是基于MVC的.MVC只是在上面扩展了一个快捷方式而已. 其次,