看了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; }
更多相关内容:点击这里>>
[Web开发][收藏]ASP.NET Starter Kit 是啥咪碗糕? [Web开发]使用 ASP.NET Community Starter Kit建造网站 [Web开发]解读ASP.NET 2.0 Internals [Web开发]解读ASP.NET Portal Starter Kit(1)——数据库篇 [Web开发]利用 ASP.NET Starter Kit 即刻开始 Web 站点开发 [Web开发]昨日关注:ASP.NET 2.0 Beta 2 Starter Kits发布 [Web开发]从ASP.NET Portal Starter Kit中学到的调整顺序新… [Web开发]解读ASP.NET Portal Starter Kit(3)——代码文件…
|