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

來源:互聯網
上載者:User
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;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.