典型的分工协作团队可控制在3-4人以内。
以三层构架作为团队开发模式,
以明确各层的分工。
一般让一到两个人负责一层(如果项目并不大的话),
分工不以页面来分,而是以层来分。
用一个《留言本》作例,
所有人员必须对留言本需求有一个明确共识,
也就是说都知道要干什么,也即客户要求得到什么。
■ 数据访问层
若数据库选择 SQL Server 或 Oracle,支持存储过程,
则可分配一名数据库设计师专门设计数据库表及存储过程。
一切与数据库相关的工作交由数据库设计师负责,
该数据库设计师可以一行 C# 的代码都不用写,
甚至他连 C# 是什么都不知道也是可以。
若采用 Access,需要由一位熟悉编程的人来封装所有SQL查询语句。
若要同时支持 Access/SQL Server/Oracle 等数据库,
可为每种数据库分别编写访问的封装类,
使用接口进行统一调用接口。
例程:
SQL Server 支持存储过程,其数据访问类仅需要提供一个简单的存储过程调用的封装类即可(该类是可重用的)。
Access 因为需要将语句直接给出,所以无法做到SQL代码与程序代码分离,需要一个既懂数据库编程及C#编程的人来封装(或者分配一个数据库设计师与其合作)。
namespace DAL
{
//接口用于统一调用。
public interface ILeave
{
//实现所需要的接口,例如:
void Add(Leave lv);
bool Remove(Guid id);
//实际中可能提供更多复杂的操作。若.NET已提供的接口符合要求可直接使用。
//例如:ICollection 接口
}
//静态即可,每个访问封装类均实现 ILeave 接口
public static class SQLProvider : ILeave
{
private DataTable Execute(....)
//封装执行存储过程的方法。
public void Add(string name, string content, string ip ...)
{
Execute("Leave_Add",....); //调用存储过程
}
}
public static class AccessProvider : ILeave
{
//Access 的数据访问程序虽然与SQL的不同,
//但是接口依然是一样的,仅是实现方式不同。
public void Add(string name, string content, string ip ...)
{
string connStr=".....";
OleDbConnection conn = new OleDbConnection(......);
conn.Open();
....... // 执行一些 SQL 语句
}
}
public static class OracleProvider : ILeave
{
}
}
一般喜欢使用工厂设计模式来实现数据相关对象(如:Connection)的创建,
至于到底是否使用工厂来创建可自行选择。
PetShop 4.0 里还使用了动态添加程序集的能力,
将各个数据访问类分别编译为 DLL,
通过配置使用指定的程序集。
这样提供更彻底的封装技术,有兴趣可去参考一下。
因为每层仅需要对其上一层负责,
而向上一层提供当前层的设计信息是必须的(使用数据字典,在开始工作前就应该计划制定好这份信息文件,因为其上一层的设计依赖该文件)。
所以数据访问层只需要提供所有存储过程的调用详细方法(如果使用支持存储过程的数据库),
包括存储过程名、参数、所期望的结果。
例如:
--------------------------------------
存储过程名 参数
说明
leave_Add
....
.......
................
--------------------------------------
封装类的说明
--------------------------------------
统一接口: ILeave
方法与属性列表及其说明罗列在此
其他类:
类名:SQLProvider(静态): ILeave
属性列表(不用包含基类的属性信息):
.............(罗列于此)
方法列表(不用包含基类的方法信息):
..............(罗列于此)
--------------------------------------
■ 业务逻辑层
业务逻辑主要职务在于功能抽象,向数据访问层请求数据并向界面层提供数据,
其实说白了就是调用数据库层封装的类。
有了数据访问层的封装,
可使业务逻辑层避免与数据库“短兵相见”。
在业务逻辑层仅使用接口,它的好处是只要接口不变,
不管使用的是哪个数据访问层封装类(如 OracleProvider 或 AccessProvider 或 SQLProvider),业务逻辑层不变,当需要修改数据访问层的类时,
业务逻辑层的代码不受影响。
例如:
根据数据访问层所提供的数据字典及设计信息,
得到这份信息文件后,业务逻辑层的程序员可以开工了。
public class Leave : ICollection
{
public void Add(Leave id)
{
//可使用工厂模式进行更好的封装。
ILeave leave = new SQLProvider(); //到底要创建的是 SQLProvider 还是 AccessProvider
//最好由外部指定,例如在 Web.config 文件里指定。
//因为使用了 ILeave 接口,所以无论创建的是哪种 Provider,要添加一个内容,下面的
// 这句代码是不变的:
leave.Add(......);
}
}
业务逻辑层也需要通过数据字典及设计信息向上一层(界面层)提供一些设计基础,
业务逻辑层主要提供已编写的类的信息,例如 Leave 类,有什么方法和属性,
及各个方法与属性的使用说明。
■ 界面层
若要各层尽可能快地开始工作,
项目的设计需要非常合理,
以及各层所依赖的数据字典或信息文件需要事先就制定好,
只要设计好这些数据字典或信息文件,
各层都可以同时开工。
界面层可由界面设计者与美工协作共同完成,
主要设计留言本的 aspx 页面、HTML、JavaScript及CSS等。
界面层只允许调用业务逻辑层包装的类,
例如要添加一条留言,可以这样:
Leave lv = new Leave();
lv.Add(.....)
[[italic] 本帖最后由 ChenMo 于 2007-12-14 13:00 编辑 [/italic]]