解讀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;
}