国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

解讀ASP.NET TimeTracker Starter Kit(2)——重構篇

2024-07-10 12:56:10
字體:
來源:轉載
供稿:網友

看了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;
}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永新县| 深泽县| 宁化县| 九寨沟县| 泸水县| 福清市| 兴和县| 阿图什市| 宜春市| 西贡区| 海门市| 临高县| 米泉市| 东乌珠穆沁旗| 宁国市| 赣州市| 卢湾区| 玉田县| 汶上县| 石柱| 五原县| 延川县| 平度市| 巴林左旗| 视频| 苍山县| 甘德县| 隆回县| 涞水县| 卫辉市| 沂水县| 岳西县| 贞丰县| 西宁市| 青铜峡市| 新晃| 黑河市| 永顺县| 永登县| 霸州市| 镇康县|