对于大部分商业应用程序,核心的设计在于数据层和商务逻辑层。没有一个“正确”的解决方案,只能按需交替使用……
多层设计概述
表现层、商务逻辑层、数据访问层和数据存储。原因:
分享逻辑思维的需要。
团队或多语言开发的需要。
重用商务逻辑与数据层的需要。
这里的多层是逻辑设计,打包和旋转是物理设计。
商务逻辑层
支持商务过程中所有涉及安全、商务规则(逻辑)和数据的处理(校验、数据操作)。
对于BankingApp来说,它可能会加强银行规则的处理,如账户类型、最小余额、借款数额等。
1)整体设计(完全OOP、大颗粒OOP、不使用OOP)。
完全OOP:任何事物都是对象,大概会有1000多个对象存储在RAM。例如Customers、Orders、Products、Addresses……OOP的巨大能量能处理任何的问题,但也带来一定的压力。
大颗粒(Large-grain)OOP:任何事物都是对象,但对象是大颗粒的,少量的全面的对象,虽然不优雅,但是更实际。例如:
不把所有的Customers都存储在RAM中,而是通过ID获得唯一的Customer,可以查找Customer IDs的子集。
public class Customers
{
public Customer Get(int customerID)
{...}
public int[] Search(...)
{...}
}
不使用OOP:没有对象-返回过程样式的编程,没有类-基于结构和静态方法。
2)安全性
安全性对于任何一层的设计都有潜在的影响。如:
谁将使用本系统?(验证)
是否允许该用户进行此操作?(权限)
在何处进行安全检验?(商务逻辑层。表现层是否需要反映出用户的权限?数据层是否需要进行检查?)
最基本的是通过商务规则进行检验。
3)商务规则
典型地通过明确的编码表现。
不同的商务情况有不同的规则。如:客户是不是有信用额度?用户是否有权限做修改?等等。但有一条通用的规则就是校验——validation。
4)数据校验处理
表现层的检验是第一级:如整型输入检验。
商务逻辑层:再做一次额外检验,例如ID是否有效,E-mail是否有效。通过编写有力的代码控制及正则表达式(Regular Expressions)...正则表达式是强大的检验技术,它将有效的输入表现为一种模式,对用户的输入,运行模式进行检验。例如:/d指定单一的数字。{0,1,2,3,4,5,6,7,8,9}。而“/w+@/w+”是一个简单的Email地址模式。即一个或多个字符加上@再加一个或多个字符。
检验Zipcode是否符合US的标准:模式:^表示开始 ?表示可选 $表示结束。
using RE=System.Text.RegularExpressions.Regex;
public class Validation
{
public static bool isUSZipcode(string s)
{
string pattern;
pattern= @"^(/d{5})((/-/d{4})?)$";
return RE.Match(s,pattern).Success;
}
}
防止SQL输入攻击:在数据被传入数据层之前,对于文本框的内容必须检验。把单引号转换为双引号等。
数据访问层
数据访问层并不管理和存储数据,它只是提供商务逻辑层和数据库之间的接口。
1)接口是High-Level或者Low-Levvel?High-Level接口隐藏BT传来的细节信息。如DataStore.update(customer);只传递过去了一个对象。
Low-Level则将数据存储细节延伸到了BT。例如先生成SQL语句交由数据访问层执行。
为解决两种接口之间的矛盾,可将数据访问层分为两级接口。后一级执行ADO.net代码,前一级负责构造SQL语句。
2)是使用存储过程还是动态SQL语句?
存储过程由DBAs编写,使数据库模式与应用程序分离,提供数据访问控制的另一层,封装复杂的SQL,保证事务执行,可能大幅度提高性能。
执行存储过程通过标准的ADO.net机制来执行。
超级信徒把所有的DAT实现在数据库!参见:http://www.adoguy.com/
Vendor-specific:存储过程对数据库有依赖性。即“提供商制订规则”,相应对DBA要求较高。
另外灵活性会降低一些。对于数据访问层的改变将影响数据库。
层之间如何传递数据?
1)基本类型的数组?
2)对象的集合?
3)原始的DataSet?
4)强类型DataSet?
强类型DataSet
强类型DataSet是特殊化的DataSet。是从DataSet继承的定制对象,可通过其显露的属性(properties)来封装数据进行强类型的访问。避免了字段的晚期绑定,强类型DataSet提供了强类型的访问器,因为避免了到一个集合中查找列名或表名,访问时更快。除了提高运行性能,还提供了类型检验,可在设计时通过自定义字段名对字段智能感知。
建立强类型:方便、面向对象且易建立,使用Visual Studio进行。
强类型DataSet==BT(商务逻辑层)?
1)建立强类型DataSet
2)添加一些实现商务逻辑的方法
可以这样工作,但要注意,如果DB的模式发生了改变,必须重新建立强类型,这时将失去商务逻辑。(注:这是.net1.0里面的说法,后来参考相关资料,在.net2.0中通过Partial类可以解决这一问题)。