安装好的petshop3.0之后,带着激动的心情把所有的功能都使用了一遍,petshop可应了一句话"麻雀虽小,五脏俱全",所以越来越喜欢它了,有如相见恨晚的感觉.我的目标就是领悟它的设计思想和学习它的优秀编码习惯.当然下面的资料部分是引用MSDN和网上的资料的,再加上个人的分析而成的.希望逐步形成一个很好的学习资料.
1. DOT NET 的整体逻辑体系结构:
Petshop在3.x版本已经使用了n(n=3)层结构,分别是Presentation Layer(表示层)/Business Logic Layer(业务逻辑层BLL)/Data Access Layer(数据访问层DAL),表示层使用了ASP.NET Web Forms,与业务逻辑层的C#组件通讯,业务组件通过ADO和SQL Server 的DAAB来访问数据库,petshop3.0安装的时候有sqlserver2000和oracle两种数据库可以选择.它是通过\web\web.config文件来识别究竟放在那个数据库.
如图:
2. 应用程序数据模型:
PetShop有两个数据库实例,分别是MSPetShop和MSPetShoporders,它们的表如下:
表名 作用
Accout 客户的基本信息
BannerData 存储广告条
Category 目录类别(总的分类)
Inventory 产品库存的状态
Item 产品的具体细节
LineItem 定单的细节
Orders 用户下的定单,定单包括一个或者多个行项目
OrderStatus 记录定单的状态
Products 产品表
Profile 客户的配置情况表
SignOn 客户登陆表
Supplier 供应商情况表
表的关系:(使用sql server2000自带的建立数据库关系图工具)
MSPetShop实例表的关系:
MSPetShopOrders实例表的关系:
3. PetShop在Visual .Net 2003的解决方案
系统元素介绍:
下面分析各个项目在系统中的作用
项目名 作用
BLL 业务逻辑组件的地方
ConfigTool 用来加密连接字符串和创建日志事件源的管理应用程序
DALFactory 用来决定加载哪一个数据库访问程序集的类
IDAL 定义所有DAL都必须实现的接口
Model 抽象业务实体/类
OracleDAL Oracle特定的DAL实现,实现了IDAL接口
Post - Build ?暂时不明白(MSDN解释为:运行编译后操作的项目,比如将程序集添加到 GAC 或 COM+)
Pre - Build ?暂时不明白(MSDN解释为:将程序集从 GAC 删除或从 COM+ 注销程序集的项目)
SQLServerDAL SQLServer特定的DAL实现,实现了IDAL接口
Utility 一组帮助类
Web Web页和控件
解决方案项 用来构建应用程序的杂项,比如用来签署应用程序程序集的 Pet Shop.snk 密钥文件
PetShop作为一个经典的例子,所以我希望把它分析得体无完肤,分功能/细节分析/问题/启发四个部分.
3.1 Model 项目
功能:
1.抽象出业务实体,这个是一个设计人员建模的过程,把系统中的实体抽象成为一个"瘦数据"类
2.都是一些属性的设置,用于在各个层里传输数据,可以被认为是数据容器.
细节分析:
1.AccountInfo.cs 客户的相关信息;与表Account和SignOn对应;该类只可以获取它的属性,而不能更改属性;在该类中定义了一个AddressInfo的对象,这样一来就可以很全面地描述了Account表.
2.AddressInfo.cs 客户的相关信息;与表Account对应;该类可以获取和设置它的属性.
3.CardItemInfo.cs 定义购物车的列表,与表item相关.
4.CreaditCardInfo.cs 信用卡相关信息;与表order相关.
5.ItemInfo.cs 产品的详细信息;与表Item对应.
6.LineItemInfo.cs 定单中具体某种商品的信息;与表LineItem相关.
7.OrderInfo.cs 定单所有商品的信息;与表Order对应;该类定义了CardItemInfo, AddressInfo, LineItemInfo对象,这样一来就可以把整个定单的信息全部描述清楚了.
8.ProductInfo.cs 产品的信息;与表Product对应.
9.仔细看Model里的每个类都有"[Serializable]",指示该类可以序列化,但是没法继承该类.System.Serializable.
问题:
1.究竟以什么为根据来判别各个类的属性可读或者可写?
2.类可以序列化有什么作用?
3.在这些类中都是设置私有字段,而且在构造函数里初始化这些字段,然后通过属性去读取或者写.这样有多少个私有变量就重构一个参数个数相同的构造函数.
4.在OrderInfo类中,为什么定义了两个AddressInfo对象?从表面上来上一个作为:_billingAddress,另外一个:_shippingAddress,我个人认为只要定义了一个对象,那就可以了,在思考中....
5.建模的时候应该采用什么方法比较好?看来我应该好好回味软件工程的方法了.
启发:
1.以后对一个项目设计首先抽象出所有的实体
2.对一个实体的属性定义还应该包含属性的组合因素项.同样一个实体可能通过其他的实体对象才能真正完美地描述.
3.2 IDAL项目
功能
1. IDAL里的各个类的划分依据是根据数据库操作来划分的,将业务逻辑和数据库操作分离开.
2. 这是一组类的接口,定义了各种类型的数据库公共的数据访问方法,使得产品数据移植性良好,当需要使用别的数据库的时候,不需要更改任何的业务逻辑就可以实现了.
3. OracleDAL 和SQLServerDAL类是实现公共的IDAL定义的方法和具体的数据访问方法,而DALFactory项是工厂模式,通过这个项根据系统的配置信息动态确定使用具体的DAL.
4. "工厂模式"的实现 : 创建一个 C# 接口,其中对于数据库访问类必须公开的每个方法都要声明一个方法。 对于每一个要支持的数据库,都创建一个实现数据库特定代码的具体类,以执行接口也称“协定”中的每一项操作。 为了支持运行时确定加载哪一个具体类,需要创建第三个类,也就是工厂类,它从配置文件中读入一个值以确定应该使用反射加载哪一个程序集。 通过 .NET 的反射命名空间,可以加载某个特定程序集并用该程序集创建某个对象的实例。 为了使应用程序更安全,为版本控制提供更好的支持,我们可以在应用程序配置文件(也就是这里的 web.config. )中添加要加载的程序集文件的“证据”,这意味着 .NET 框架将只加载我们在编译期间签过名而且有正确版本号的程序集。
细节分析
1. IAccount.cs 定义了获得客户信息,和注册/更新客户信息的数据库访问操作接口.
2. IInventory.cs定义了获得具体某种商品的存货量和计算某客户定单后某种商品的剩余存货量的数据库访问操作接口.
3. IItems.cs定义了获取某种商品种类的商品信息和获取某商品的商品信息的数据库访问操作接口.
4. IOrder.cs定义了增加定单和获取定单的数据库访问操作接口.
5. IProduct.cs定义了通过种类和关键字查询商品的数据库访问操作接口.
6. IProfile.cs根据统计获取客户喜欢的商品图标信息.
问题
启发
1.如果更加有效地抽象出实体公共的数据库操作接口?看来大学的软件工程学得真太烂拉...我横观看了SQLServerDAL感触..
3.3 SQLServerDAL 和 OracleDAL项
功能
细节分析
问题
启发