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