第八讲:多层结构应用程序设计

*多层设计
商业应用程序一般会有多层
表现层,商务逻辑层,数据访问层和数据存储
Presentation-->Business-->Data Access-->DataStore

*不要弄混逻辑与物理
使用多层是逻辑设计
打包和放置是物理设计

*三种解决方案
全完OOP:
任何事物都是对象,在概会有1000多个对象存储在RAM
例如:Customers,Producte,Orders,Addresses,...
OOP的巨大能量能处理任何的问题,但也带来一定的压力。
大颗粒(Large-grain)OOP:
任何事物都是对象,但是对象是大颗粒的。
少理的全面的对象,虽然不优雅,但是更实际。

*安全性
安全性对于任何一层的设计都是有潜在的影响
谁将使用本系统?(验证)
是否允许该用户进行此操作?(权限)
在何处进行安全检查?
商务逻辑层
表现层是否需要反映出用户的权限?
数据层是否需要进行检查?
最基本的,通过商务规则来进行检验...

*正则表达式
REs是强大的检验技术
过程:
有效的输入被表现为一种模式
对于用户的输入,运行模式进行检验。
例如:
"\d"指定单一的数字{0,1,2,3,4,5,6,7,8,9}
"\w+@\w+"是一个简单的Email地址模式。
(1个或多个字符加上@再上一个或多个字符)

例子:检验Zipcode是否符合US的标准
Zip or Zip+4
模式:^表示开始,?可选,$结束
public static bool isUSZipcode(string s)
{
 string patten;
 patten=@%22%5E(\d%7B5%7D)((\-\d%7B4%7D)?)$";
 return RE.Match(s,pattern).Success;
}

*防止SQL输入攻击
在数据被传入到数据层之前,对于文本框的内容必须检验。
public static bool isProperlyEscaped(string s)
{
 string pattern="^([^']|(''))*$";
 return RE.Match(s,pattern).Success;
}

if(Validation.isProperlyEscaped(s))
{
 //okay
}
else
{
 s=s.Replace("'",""");
}

*数据访问层并不管理和存储数据,它只是提供商务逻辑层和数据库之间的接口。
*如何设计接口?
考虑的主要问题:
High-level or low-level接口?
存储过程或者动态SQL语句?

*强类型DataSets
强类型DataSet是特殊化的DataSet
1、强类型DataSet是从DataSet继承的定制对象,它可以通过其显露的属性(properties)来对封装数据进行

强类型的访问。
2、强类型DataSet避免了字段的晚绑定。强类型DataSet提供了强类型的访问器,因为避免了到一个集合中

查找列名或表名,访问时更快。
3、除了能够提高运行时的性能,强类型DataSet还提供了类型检查,并且在设计时可以通过自定义字段名

对字段智能感知。


*用户数据的例子:
System.Data.DataSet             DS;
DataAccessTier.CustomersDataSet customersDS;
...
dataAdapter.Fill(DS);
FirstName=DS.Tables["Customers"].Rows[i]["FirstName"].ToString();
//比较
dataAdapter.Fill(customersDS);
FirstName=customersDS.customers[i].FirstName;

*如何建立强类型
方便的,面向对象的,且易建立的
可以使用Visual Studio来建立
DB-->schema.xsd-->XSD-->typed dataSet.cs

 

付加一段代码,方便记忆!

 

SpecialRoomDataTableAdapters.BookingRoomTableAdapter brt = new SpecialRoomDataTableAdapters.BookingRoomTableAdapter();
SpecialRoomDataTableAdapters.ClassTableAdapter crt = new SpecialRoomDataTableAdapters.ClassTableAdapter();
SpecialRoomData.BookingRoomDataTable sr=new SpecialRoomData.BookingRoomDataTable();
SpecialRoomData.ClassDataTable ct = new SpecialRoomData.ClassDataTable();

    protected void Page_Load(object sender, EventArgs e)
    {

       
        brt.Fill(sr);
       
        crt.Fill(ct);
        Label1.Text = sr[0].BTeacherName;
        GridView1.DataSource = ct.DefaultView;
        GridView1.DataBind();

    }

posted @ 2009-03-03 12:23  teacherzj  阅读(185)  评论(0编辑  收藏  举报