Duwamish
是
Microsoft
提供一个企业级的分布式系统架构,如果开发企业级的分布式系统,可以模仿这种架构,如果是开发一些简单的系统,则完全可以简化。
以前也学习过
Duwamish
范例,只是发现不同时间,不同经历,有不同的体会。正如卢彦所说的一样:通过研究
Duwamish
示例,高手能够领悟到
.Net
应用架构的设计思想,低手能够学习到
.Net
的编程技巧,实在是老少皆宜。
因此,这里再次学习并体验一次
Duwamish
范例。
1
,
Duwamish 7.0
结构分为四个逻辑层(
FROM MSDN
):
Web
层
-
Presentation
Web
层为客户端提供对应用程序的访问。这一层是作为
Duwamish.sln
解决方案文件中的
Web
项目实现的。
Web
层由
ASP.NET Web
窗体和代码隐藏文件组成。
Web
窗体只是用
HTML
提供用户操作,而代码隐藏文件实现各种控件的事件处理。
业务外观层
-
Business Facade
业务外观层为
Web
层提供处理帐户、类别浏览和购书的界面。这一层是作为
Duwamish.sln
解决方案文件中的
BusinessFacade
项目实现的。业务外观层用作隔离层,它将用户界面与各种业务功能的实现隔离开来。除了低级系统和支持功能之外,对数据库服务器的所有调用都是通过此程序集进行的。
业务规则层
-
Business Rules
业务规则层是作为
Duwamish.sln
解决方案文件中的
BusinessRules
项目实现的,它包含各种业务规则和逻辑的实现。业务规则完成如客户帐户和书籍订单的验证这样的任务。
数据访问层
-
Data Access
数据访问层为业务规则层提供数据服务。这一层是作为
Duwamish.sln
解决方案文件中的
DataAccess
项目实现的。
除了上述四个逻辑层外,
Duwamish 7.0
还包含封装在
Duwamish.sln
解决方案文件中的
Common
项目内的共享函数。“通用”
(Common)
层包含用于在各层间传递信息的数据集。
Common
项目还包含
Duwamish.sln
解决方案文件中的
SystemFramework
项目内的应用程序配置和跟踪类。
2,各个逻辑层之间的关系图(FROM MSDN)及其调用Sequeance
图示例:
下面是
Categories.aspx web
页面获取
Category
的
Description
的整个调用过程。
(
1
)实例化
ProductSystem
对象
(
2
)调用
ProductSystem
的
GetCategories()
方法
(
3
)检测参数的合法性
(
4
)创建
Categories::DataAccess
对象实例
(
5
)返回上述对象
(
6
)调用
Categories::DataAccess
对象的
GetCategories()
方法
(
7
)创建
CategoryData::Common
对象实例
(
8
)返回上述对象
(
9
)返回
CategoryData::Common
对象实例,该实例中已经包含了需要的数据
(
10
)返回
CategoryData::Common
对象实例给
web/Client
端
(
11
)检测数据的合法性
(
12
)读取并显示结果:
Category
的
Description
SystemFramework
项目包含一些
application
需要的配置参数,
ApplicationLog
日志类和
ApplicationAssert
参数校验类。
SystemFramework
项目为所有其他的项目所引用。
Common
项目包含了用于在各层间传递信息的数据集,如上述的
CategoryData
继承
System.Data.DataSet
,既不是所谓的
typed DataSet
,也不是一般的
DataSet
,不过简单实用,这是基于
.Net Remoting
开发分布式系统用来
tier
与
tier
之间交互数据的一种方法。
Common
项目也被其他的项目引用,
SystemFramework
项目除外。
BusinessFacade
项目中所有的
Classes
继承
MarshalByRefObject
class
,显然是让准备将
BusinessFacade tier
部署为
Remote Objects
。不过,实际上默认这里并没有将其部署为
Remote Objects
,
Web
层仍然调用本地对象(《
Duwamish
部署方案篇
》将分析这个问题)。
3
,
Summary
在开发基于
.Net Framework
企业级分布式系统时,上述架构值得推荐,但也并非完美无暇,实际上存在一些值得改进的地方。显然,不可能一个范例适合所有的实际情况么,要求太苛刻了。其实,
Enterprise Samples
中的另外一个范例
Fitch and Mather 7.0
,其架构和
Duwamish
就有些不同了。
如果是开发本地的系统,就不要模仿
Duwamish
架构(看看上面获取
Category
的
Description
调用过程就知道了,太费劲。),如
Business Facade
和
Business Rules
中
Classes
应采用
fine-grained interface
设计,层与层之间的交互参数也不必全部采用
DataSet
,适当的时候采用
setter/getter
就可以了,这样不仅可以提高开发效率,而且有助于提高
performance, maintainability and
reusability
。