看了ASP.NET Time Tracker Starter Kit的代码以后,觉得这个程序是学习面向对象编程开发的一个好案例。整个程序从功能上来讲就是记录人员参加项目工作的工时记录。分析得出主要有人员、项目、工时记录这几个类。整个程序正好是以这几个类为基础展开的。在业务逻辑层里TTUser(用户类)、Project(项目类)和TimeEntry(工时记录类)分别就包括了对相应表的增、删、改等操作和整个程序中所用到的对这几个主要对象的各种操作。整个程序在类的划分和功能上做的很好,但是我觉得在三层架构的划分上不是很理想。

业务逻辑层包含的许多数据访问层的东西,如:数据库连接信息、用到的存储过程等。而这些信息我觉得放在数据访问层应该会更好一些。作为数据访问层,应该为数据逻辑层提供访问数据库的方法,而不是只提供一个简化数据访问的组件(DAAB)。假设要使用Oracle数据,那么改动的代码就需要改动很多,同时也不利于将来的改动。

我的想法是:彻底的将与数据相关的操作从数据逻辑层分离出去,对数据访问层只提供访问方法。在数据访问层的设计上,还是沿用“为数据访问层编写一个基类”的方法,通过基类访问DAAB。这样一来如果要变换为Oracle数据库,只要修改DAAB中的内容即可。大家帮忙看看我的改进代码,看看思路有无问题。

数据访问层基类:

解读ASP.NET TimeTracker Starter Kit(2)——重构篇using System;
解读ASP.NET TimeTracker Starter Kit(2)——重构篇
using System.Data;
解读ASP.NET TimeTracker Starter Kit(2)——重构篇
//数据访问组件(用的微软提供的)
解读ASP.NET TimeTracker Starter Kit(2)——重构篇
using MyStarterKit.DDAB;
解读ASP.NET TimeTracker Starter Kit(2)——重构篇
解读ASP.NET TimeTracker Starter Kit(2)——重构篇
namespace MyStarterKit.TimeTracker.DAL
{

解读ASP.NET TimeTracker Starter Kit(2)——重构篇    
/// DALBase 的摘要说明。
解读ASP.NET TimeTracker Starter Kit(2)——重构篇    
/// 数据访问层积累
解读ASP.NET TimeTracker Starter Kit(2)——重构篇    
/// </summary>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇    public class DALBase
{
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
//数据库连接字符串
解读ASP.NET TimeTracker Starter Kit(2)——重构篇
        private string CONNSTR = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];
解读ASP.NET TimeTracker Starter Kit(2)——重构篇
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
public DALBase()
{
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        }

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

解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// 返回一个单值
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// </summary>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// <param name="commandText"></param>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// <param name="parameterValues"></param>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// <returns></returns>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        protected object ExecuteScalar(string commandText, params object[] parameterValues)
{
解读ASP.NET TimeTracker Starter Kit(2)——重构篇            
return SqlHelper.ExecuteScalar(CONNSTR, commandText, parameterValues);
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        }

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

解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// 执行无返回值操作
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// </summary>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// <param name="commandText"></param>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// <param name="parameterValues"></param>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        protected void ExecuteNonQuery(string commandText, params object[] parameterValues)
{
解读ASP.NET TimeTracker Starter Kit(2)——重构篇            SqlHelper.ExecuteNonQuery(CONNSTR, commandText, parameterValues);
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        }

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

解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// 返回DataSet
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// </summary>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// <param name="commandText"></param>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// <param name="parameterValues"></param>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// <returns></returns>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        protected DataSet ExecuteDataset(string commandText, params object[] parameterValues)
{
解读ASP.NET TimeTracker Starter Kit(2)——重构篇            
return SqlHelper.ExecuteDataset(CONNSTR, commandText, parameterValues);
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        }

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

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

 

数据访问层代码:(以项目类数据访问层代码为例)

解读ASP.NET TimeTracker Starter Kit(2)——重构篇using System;
解读ASP.NET TimeTracker Starter Kit(2)——重构篇
using System.Data;
解读ASP.NET TimeTracker Starter Kit(2)——重构篇
解读ASP.NET TimeTracker Starter Kit(2)——重构篇
namespace MyStarterKit.TimeTracker.DAL
{

解读ASP.NET TimeTracker Starter Kit(2)——重构篇    
/// Project 的摘要说明。
解读ASP.NET TimeTracker Starter Kit(2)——重构篇    
/// 项目信息类(数据访问层代码)
解读ASP.NET TimeTracker Starter Kit(2)——重构篇    
/// </summary>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇    public class Project : DALBase
{
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
public Project()
{
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        }

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

解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// 获取全部的项目列表
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// </summary>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// <returns></returns>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        public DataSet GetAllProjects()
{
解读ASP.NET TimeTracker Starter Kit(2)——重构篇            
return base.ExecuteDataset("TT_ListAllProjects");
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        }

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

解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// 获取项目列表
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// </summary>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// <param name="parameterValues"></param>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// <returns></returns>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        public DataSet GetProjects(params object[] parameterValues)
{
解读ASP.NET TimeTracker Starter Kit(2)——重构篇            
return base.ExecuteDataset("TT_ListProjects",parameterValues);
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        }
 
解读ASP.NET TimeTracker Starter Kit(2)——重构篇

解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// 删除项目
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// </summary>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// <param name="parameterValues"></param>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        public void Remove(params object[] parameterValues)
{
解读ASP.NET TimeTracker Starter Kit(2)——重构篇            
base.ExecuteNonQuery("TT_DeleteProject",parameterValues);
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        }

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

解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// 更新项目
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// </summary>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// <param name="parameterValues"></param>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        public void Update(params object[] parameterValues)
{
解读ASP.NET TimeTracker Starter Kit(2)——重构篇            
base.ExecuteNonQuery("TT_UpdateProject",parameterValues);
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        }

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

解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// 新增项目
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// </summary>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// <param name="parameterValues"></param>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        
/// <returns>新项目的Id</returns>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        public int Insert(params object[] parameterValues)
{
解读ASP.NET TimeTracker Starter Kit(2)——重构篇            
return Convert.ToInt32(base.ExecuteScalar("TT_AddProject",parameterValues));
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        }

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

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


业务逻辑层代码:(以项目类业务逻辑层代码为例)

 


解读ASP.NET TimeTracker Starter Kit(2)——重构篇/// 根据用户和用户角色,获取指定用户能够查看的项目列表
解读ASP.NET TimeTracker Starter Kit(2)——重构篇
/// </summary>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇
/// <param name="userID"></param>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇
/// <param name="role"></param>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇
/// <returns></returns>
解读ASP.NET TimeTracker Starter Kit(2)——重构篇public static ProjectsCollection GetProjects(int userID, string role)
{
解读ASP.NET TimeTracker Starter Kit(2)——重构篇    
string firstName = string.Empty;
解读ASP.NET TimeTracker Starter Kit(2)——重构篇    
string lastName = string.Empty;
解读ASP.NET TimeTracker Starter Kit(2)——重构篇    
// 创建数据访问层类
解读ASP.NET TimeTracker Starter Kit(2)——重构篇
    DAL.Project project = new DAL.Project();
解读ASP.NET TimeTracker Starter Kit(2)——重构篇    
// 调用数据访问层方法
解读ASP.NET TimeTracker Starter Kit(2)——重构篇
    DataSet ds = project.GetProjects(userID, Convert.ToInt32(role));
解读ASP.NET TimeTracker Starter Kit(2)——重构篇    ProjectsCollection projects 
= new ProjectsCollection();
解读ASP.NET TimeTracker Starter Kit(2)——重构篇    
foreach(DataRow r in ds.Tables[0].Rows)
{
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        Project prj 
= new Project();
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        prj.ProjectID 
= Convert.ToInt32(r["ProjectID"]);
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        prj.Name 
= r["ProjectName"].ToString();
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        prj.Description 
= r["Description"].ToString();
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        prj.ManagerUserID 
= Convert.ToInt32(r["ManagerUserID"]);
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        prj.ManagerUserName 
= TTUser.GetDisplayName(Convert.ToString(r["UserName"]), ref firstName, ref lastName);
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        prj.EstCompletionDate 
= Convert.ToDateTime(r["EstCompletionDate"]);
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        prj.EstDuration 
= Convert.ToDecimal(r["EstDuration"]);
解读ASP.NET TimeTracker Starter Kit(2)——重构篇        projects.Add(prj);
解读ASP.NET TimeTracker Starter Kit(2)——重构篇    }

解读ASP.NET TimeTracker Starter Kit(2)——重构篇    
return projects;
解读ASP.NET TimeTracker Starter Kit(2)——重构篇}

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

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-11-09
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-08
猜你喜欢
  • 2021-05-25
  • 2021-08-31
  • 2022-12-23
  • 2021-06-03
  • 2021-10-05
  • 2021-07-09
  • 2021-12-24
相关资源
相似解决方案