N-Tier Server/(Smart)Client 应用程序的设计和开发

 

2005-9-2 Redmoon

http://redmoon.cnblogs.com http://bbs.dotnettools.org/activeubb/

体系结构

通用体系结构

上面是经典的体系结构,包含了用户界面(User Interface),商业前端/服务(Business Facade/Service),商业逻辑(Business Logic),数据访问(Data Access),数据源(Data Source)。

为了把ClientServer依赖分开(实现松耦合),需要把Facade提供的操作抽象为接口放在独立的程序集中,可以把这样的接口组件称为商业接口/服务接口(Service Interface

整个体系结构的过程为:ClientUI通过SI调用Server端的Service的各个OperationService层组件调用BL层组件,BL层组件调用DA层组件,DA获取到数据后被映射处理为实体BE组件,并最终返回给UI。在这个通常过程中,可能会有一些细节的特殊处理和变化,下文讨论。

简化后的体系结构



在一些小型项目或者小产品中(或者说扩展和灵活的需求不高的情况下),由于开发的复杂度和业务开发人员对体系结构的理解程度,经典的体系结构可能会降低开发效率,因而有必要建立一个简化的体系结构。

简化的体系结构主要精简了如下方面:

1.         BLService组件合并,且Service组件可以通过一些Helper类直接获取数据,从而也省略了DAL组件

2.         ClientServer之间紧耦合,从而省略SI组件,UI直接调用Service组件

3.         在某些工具的帮助下,把EntityDA合并(同时生成)。

设计风格

这里讨论在面向领域设计和面向数据设计的情况下如何应用上面的两种体系结构(和对体系结构的影响),并不对这两种设计方法进行讨论。但是本文对两种设计风格有如下的假设:

l         面向领域:代表先有Class后有DataBase(持久存储),且Class包含了OperationEntity

l         面向数据:代表先有DataBase后有Class(不管这个ClassCustom Class 还是DataSet),有独立的数据操作对象

面向领域的设计

1.         根据业务逻辑实现BL组件,由于BL组件通过ORMapper(或者Object DataBase)访问数据,因而DA被省略或者说被代替;由于BL组件同时也表示了业务的实体,因而BE也被省略(代替);

2.         需要聚合业务逻辑的操作成为Service,是否需要SI,可根据是否需要隔离ClientServer的依赖而定。

3.         由于BLBE合并,需要添加数据传输对象DTO,来作为ClientService间传递数据的容器。DTO可以是通用化的也可以针对Entity特例化。

4.         UI显示和操作DTO,对真实的商业实体并不关心;UI调用Service,对真实的商业逻辑并不关心。

面向数据的设计

1.         通过工具生成或者按照特定规范手写EntityDA

2.         Service可直接调用DA操作数据,因而在某些情况下(或者简单业务下)可省略BL

3.         Entity即表示了Data Schema(数据模型)也作为DTOClientServer传递,被UI显示和操作。

一种快速简易的开发模式

使用一些新技术和新工具,并应用简化的体系结构,使用面向数据的设计风格进行快速的开发。

技术要点

.NET 2.0

1.         范型Generic

2.         ADO.NET的加强

3.         Partial

VS2005

1.         TableAdapter组件

2.         Partial类的支持

3.         DataSource

实践要点

1.使用TableAdapter设计器(前DataSet设计器)可以根据现有的数据结构方便的生成EntityTyped DataSet)和DATableAdapter)。但是目前的VS2005 Beta2 TableAdapter设计器只能支持ConnectionString在配置文件中配置,不能支持外部传入连接对象的方式,因而我们利用Partial类可以很好的解决这个问题。在Partial类中定义一个带SqlConnection参数的构造器,如:

public partial class UserTableAdapter

{

        public UserTableAdapter(SqlConnection conn)

        {

            this.Connection = conn;

        }

}

2.如果Entity不使用DataSet,使用Custom Class,则可以使用范型集合来包装Custom Class

3.使用数据绑定功能把UI ControlEntity进行绑定,不过是DataSet还是Custom Class集合都可以通过BindingSource这个桥梁和UI绑定。

其他说明

本文提出的应用程序体系结构和开发实践要点只是我的一些对架构设计和开发的实践经验,并非完全正确和适用所有情况。也并没有涉及过多开发的具体问题。如果读者有什么具体问题欢迎和我进行深入讨论。

本文也没有涉及AOPIOC等技术的应用,也没有阐述这些技术对于体系结构的影响,希望大家和我讨论这方面的问题。

对于本文提到的快速简易的开发模式的具体应用实例,我稍后可能会以源码的形式提供一个开发框架。

posted @ 2005-09-02 16:51  朱永光  阅读(3520)  评论(15编辑  收藏  举报