国产探花免费观看_亚洲丰满少妇自慰呻吟_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;
}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 江西省| 碌曲县| 白沙| 漠河县| 吉木乃县| 独山县| 玉树县| 苍山县| 惠东县| 西城区| 遵化市| 曲周县| 昭苏县| 合川市| 广昌县| 铜梁县| 滦平县| 镇远县| 曲沃县| 上思县| 清镇市| 开远市| 桦南县| 长兴县| 宜君县| 白沙| 城口县| 柘城县| 鲁山县| 彰武县| 文安县| 涪陵区| 黎川县| 潼关县| 乐清市| 民和| 金堂县| 叙永县| 宿州市| 苍山县| 克山县|