C#学习笔记(六)多层应用程序设计

对于大部分商业应用程序,核心的设计在于数据层和商务逻辑层。没有一个“正确”的解决方案,只能按需交替使用……


多层设计概述

表现层、商务逻辑层、数据访问层和数据存储。原因:
分享逻辑思维的需要。
团队或多语言开发的需要。
重用商务逻辑与数据层的需要。

这里的多层是逻辑设计,打包和旋转是物理设计。

 

 

商务逻辑层

支持商务过程中所有涉及安全、商务规则(逻辑)和数据的处理(校验、数据操作)。
对于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类可以解决这一问题)。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值