分享
 
 
 

解读ASP.NET TimeTracker Starter Kit(2)——重构篇

王朝asp·作者佚名  2006-01-31
窄屏简体版  字體: |||超大  

看了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;

}

更多相关内容:点击这里>>

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有