现在的位置: 首页 > 综合 > 正文

[摘] Duwamish一些文章

2013年12月05日 ⁄ 综合 ⁄ 共 14495字 ⁄ 字号 评论关闭
 C:/Program   files/Microsoft   Visual   Studio   .NET/Enterprise   Samples/Duwamish   7.0   CS

Duwamish 7.0 支持两种多计算机部署方案。非分布式部署方案在一台 Web 主机上部署 Web 层、业务外观、业务规则和数据访问层,但可以在群集间复制该 Web 主机以达到负载平衡。分布式方案在单独的服务器上部署特定的组件。例如,业务外观、业务规则和数据访问层可能位于独立于 Web 主机的服务器上。在实际部署中数据库服务器通常位于单独的计算机上。

1, 非分布式部署方案

在一台 Web 主机上部署 Web 层、业务外观、业务规则和数据访问层,然后通过软件(如Application Center 2000)或硬件来实现网络场(Web Farm)内各个Web Server的负载平衡。

在本机默认安装Duwamish 7.0时,是采用非分布式部署方案。

2, 分布式部署方案

使用 .NET Framework 远程处理技术将应用程序分布到多台计算机中。简单而言,就是IIS Web ServerApplication Server分离,其中Web层(包括SystemFrameworkCommon项目)部署在IIS Web上,BusinessFacde/BusinessRules/DataAccess层(包括SystemFrameworkCommon项目)一起部署在Application Server上。

 

Duwamish 7.0 使用 HTTP/二进制而不是 HTTP/SOAP。使用 HTTP 的决定基于要通过端口 80 上的防火墙的要求。使用二进制而不是 SOAP 的决定基于性能上的考虑。对于大的数据块,二进制的性能优于 SOAP。因此,如果要传递大的数据块(例如,数组、数据集或数据表),则使用二进制格式化程序。如果要传递小的数据块,则选择使用 SOAP 还是二进制格式化程序是无关紧要的。传递整数时两者的性能都很好。

3, 如何将Duwamish 7.0部署为基于.Net Remoting的分布式系统

下面采用Microsoft提供的Deploytool工具自动进行(其实手工也很方便):

C:/Program Files/Microsoft Visual Studio .NET 2003/Enterprise Samples/Duwamish 7.0 CS>deploytool deploy RemoteMachine=localhost path="C:/Program Files/Microsoft Visual Studio .NET 2003/Enterprise Samples/Duwamish 7.0 CS/Duwamish7_Remote" 

command line窗口输入上述命令行代码。

[10/29/2004 6:43:43 AM] Creating directory C:/Program Files/Microsoft Visual Studio .NET 2003/Enterprise Samples/Duwamish 7.0 CS/Duwamish7_Remote on W1MIS38

[10/29/2004 6:43:43 AM] Stopping all internet services on W1MIS38

[10/29/2004 6:43:59 AM] Deploying Duwamish7 Business Facade on W1MIS38

[10/29/2004 6:43:59 AM] Creating web site on W1MIS38

[10/29/2004 6:44:00 AM] Generating remoting configuration files

[10/29/2004 6:44:00 AM] Starting all internet services on W1MIS38

[10/29/2004 6:44:02 AM] Starting Default Web Site on W1MIS38

[10/29/2004 6:44:02 AM] Deployment successful

运行结果:

1)在IIS创建中创建Web ApplicationDuwamish7_Facade),本地路径为:C:/Program Files/Microsoft Visual Studio .NET 2003/Enterprise Samples/Duwamish 7.0 CS/Duwamish7_Remote/web 作为Remote Server端,Bin目录下是BusinessFacde/BusinessRules/DataAccess层(包括SystemFrameworkCommon项目)DLL文件。

其中web.config文件中包含所有Remote Objects的配置,如

<wellknown mode="Singleton" type="Duwamish7.BusinessFacade.ProductSystem, Duwamish7.BusinessFacade" objectUri="ProductSystem.rem" />

2Web层创建remotingclient.cfg配置文件,对Application Server而言,Web层相当与Client端。

remotingclient.cfg配置文件中包含formatter的设置(binary ),选择二进制格式化程序来序列化消息,注意是出于性能的考虑。

3Web application加载remotingclient.cfg配置文件

Web applicationglobal.asax文件包括如下代码,在Application_OnStart事件中加载Retmoting配置文件。

void Application_OnStart()

{

ApplicationConfiguration.OnApplicationStart(Context.Server.MapPath( Context.Request.ApplicationPath ));

string configPath = Path.Combine(Context.Server.MapPath( Context.Request.ApplicationPath ),"remotingclient.cfg");

if(File.Exists(configPath))

    RemotingConfiguration.Configure(configPath);

}

其中前面代码ApplicationConfiguration.OnApplicationStart()是调用Duwamish7.SystemFramework.ApplicaitonConfigurationOnApplicationStart()方法,用来初始化application root和读取web.config中的配置信息(将在Duwamish代码分析篇》中进行具体分析)。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
 
Duwamish深入剖析-结构篇

摘要:
本文深入详细的介绍了Duwamish网上电子书店例程的结构框架,并详细的分析了该结构的若干特点和设计模式。

目录:
引言
Duwamish介绍
结构分析
设计思想
代码示例
总结
作者

引言:
能够作为Visual Studio .Net附带的例子,Duwamish一定包含了微软.Net设计队伍希望向开发者传达的某些信息,而事实上,Duwamish也的确能够称作是一个.Net开发者学习的经典示例,无论是从其设计架构,编程技巧或代码风格,都向我们展示了一个标准的.Net企业级应用程序所应该具有的特点。所以,通过研究Duwamish示例,高手能够领悟到.Net应用架构的设计思想,低手能够学习到.Net的编程技巧,实在是老少皆宜。 :)
不过,本文的目的更多的是针对中级.Net学习者,这类读者往往已经熟悉了C#或者是VB.NET的语法,会用一些基本的类库,并已经会做一些比较小的程序。但是当他们开始着手开发一个真正具有实用价值的企业级应用的时候,却有种无处下手的感觉。如果你正巧属于这类学习者,请跟着我深入到Duwamish的世界中去,相信你一定会得到收获。

Duwamish介绍:
Microsoft公司每次推出新技术,总是会相应的推出一些公开源代码的应用范例来说明该项新技术的特点,而开发者也能通过研究该范例的代码来达到迅速掌握新技术并与以实施的目的。Microsoft通过对一个虚拟的在网上销售图书的电子商务公司网上销售系统应用的创建,向用户展现了典型的网上购物实践中最为普遍的电子商务企业对客户 (B2C) 模式,它包括成员资格、帐户管理、购物车、搜索和结帐过程等基本功能。Duwamish经历了三个版本4.0,5.0和7.0版,每一个版本的发布都印证了技术进步的过程,每一个版本都代表了当时最先进的技术动向。这里将要研究和讨论的是Duwamish的最高版本7.0版,经历了COM/COM+技术以及Microsoft DNA架构的Duwamish,在最新的版本中完全采用了.Net技术及架构,比以前显得更加先进和成熟。

如果您安装了Visual Studio .Net的话,您可以在您的VS.Net 的Enterprise Samples目录下找到并安装它,例如:C:/Program Files/Microsoft Visual Studio .NET/Enterprise Samples/,或者您还可以到http://astradigital.com/Duwamish7Vb/这个地址去看看它在Internet的一个演示实例。其它有关Duwamish的详细介绍资料请参考Visual Studio .Net附带的MSDN帮助,地址是:ms-help://MS.VSCC/MS.MSDNVS.2052/dwamish7/html/vtoriDuwamishBooks70.htm,这里不再赘述。

Duwamish结构分析:
Duwamish 7.0 是一个典型的N层架构,其结构分为四个逻辑层:
Web 层
Web 层为客户端提供对应用程序的访问。这一层是作为 Duwamish.sln 解决方案文件中的 Web 项目实现的。Web 层由 ASP.NET Web 窗体和代码隐藏文件组成。Web 窗体只是用 HTML 提供用户操作,而代码隐藏文件实现各种控件的事件处理。
业务外观层
业务外观层为 Web 层提供处理帐户、类别浏览和购书的界面。这一层是作为 Duwamish.sln 解决方案文件中的 BusinessFacade 项目实现的。业务外观层用作隔离层,它将用户界面与各种业务功能的实现隔离开来。除了低级系统和支持功能之外,对数据库服务器的所有调用都是通过此程序集进行的。
业务规则层
业务规则层是作为 Duwamish.sln 解决方案文件中的 BusinessRules 项目实现的,它包含各种业务规则和逻辑的实现。业务规则完成如客户帐户和书籍订单的验证这样的任务。
数据访问层
数据访问层为业务规则层提供数据服务。这一层是作为 Duwamish.sln 解决方案文件中的 DataAccess 项目实现的。
比较令人困惑的是其中的业务外观层和业务规则层,很多人在学习N层结构开发的时候,听得最多的是三层结构,分别为:表示层,中间层和数据层。Duwamish的WEB层和数据访问层比较好理解,也就是传统意义上的表示层和数据层,那么业务外观层和业务规则层和我们熟悉的中间层有什么联系呢?

设计思想:
在Web应用程序中,有部分操作只是简单的从数据库根据条件提取数据,不需要经过任何处理,而直接将数据显示到网页上,比如查询某类别的图书列表。而另外一些操作,比如计算定单中图书的总价并根据顾客的级别计算回扣等等,这部分往往有许多不同的功能的类,操作起来也比较复杂。我们可以先想象一下,如果我们采用三层结构,这些商业逻辑一般是会放在中间层,那么对内部的这些大量种类繁多,使用方法也各异的不同的类的调用任务,就完全落到了表示层。这样势必会增加表示层的代码量,将表示层的任务复杂化,和表示层只负责接受用户的输入并返回结果的任务不太相称,并增加了层与层之间的耦合程度。
为了解决这个问题,我们先来看看《设计模式》一文中对Facade模式的描述:
意图:
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
适用性:
当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过Facade层。
客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过Facade进行通讯,从而简化了它们之间的依赖关系。
结构图:

上文提出的这个矛盾,正好和设计模式中Facade模式中所描述的需要解决的问题非常吻合,在《设计模式》中提出的解决的办法就是引入一个Facade对象,让这个Fa&ccedil;ade来负责管理系统内部类的调用,并为表示层提供了一个单一而简单的接口。这个Fa&ccedil;ade对象,在我们的Duwamish的设计中,就是BusinessFacade(业务外观)层。
以下是Duwamish的结构关系图:

我们从图中可以清楚的看到,浏览器首先调用的是表示层WEB,然后WEB将请求发送给业务外观层,业务外观层对请求进行初步的处理,判断是否需要调用业务规则层,还是直接调用数据访问层获取数据。最后由数据访问层访问数据库并按照来时的步骤返回结果到浏览器(对于图中涉及到其它的结构模块以后会分别予以详细介绍)。

代码示例:
以下是两种不同处理路径的代码示例:
获取商品目录
表示层调用业务外观层:
productSystem = new ProductSystem();
categorySet = productSystem.GetCategories(categoryID);
业务外观层直接调用数据层:
public CategoryData GetCategories(int categoryId)
{
    if ( dsCommand == null )
    {
        throw new System.ObjectDisposedException( GetType().FullName );
    }            
     return FillCategoryData("GetCategories", "@CategoryId", categoryId);
}
添加定单
表示层调用业务外观层:
public void AddOrder()
{
    ApplicationAssert.CheckCondition(cartOrderData != null, "Order requires data", 
		ApplicationAssert.LineNumber);
    ApplicationLog.WriteTrace("Duwamish7.Web.Cart.AddOrder:/r/nCustomerId: " +
           cartOrderData.Tables[OrderData.CUSTOMER_TABLE].Rows[0][OrderData.PKID_FIELD].ToString());
    cartOrderData = (new OrderSystem()).AddOrder(cartOrderData);
}
业务外观层调用业务规则层:
public OrderData AddOrder(OrderData order)
{
    ApplicationAssert.CheckCondition(order != null, "Order is required",
	ApplicationAssert.LineNumber);
    
    (new BusinessRules.Order()).InsertOrder(order);
    return order;
}
业务规则层调用数据层:
public bool InsertOrder(OrderData order)
{    
	//此处省略复杂的处理逻辑
    if ( isValid )
    {
        using (DataAccess.Orders ordersDataAccess = new DataAccess.Orders())
        {
            return (ordersDataAccess.InsertOrderDetail(order)) > 0;
        }
    }
    else
        return false;
}

总结:
通过分析Duwamish7的结构设计,我们掌握了Fa&ccedil;ade模式,并学习到了如何通过Fa&ccedil;ade模式对应用结构进行改进,同时了解了Duwamish7的基本概念和处理流程,为以后深入分析和学习Duwamish7的的其它部分打下了一个基础。

作者:
卢彦

版权声明

凡在本网站发表的文章,作者必须保证是原创文章;如果不是原创文章,由此带来的版权纠纷由作者自己承担。微软有义务对本站点发表的文章进行审核,但您需要考虑这些文章的使用风险。本站点仅提供一个用户相互交换技术信息和学习的园地,并不对来自社区用户的技术文章承担任何风险。

DuwamishMicrosoft提供一个企业级的分布式系统架构,如果开发企业级的分布式系统,可以模仿这种架构,如果是开发一些简单的系统,则完全可以简化。
 
以前也学习过Duwamish范例,只是发现不同时间,不同经历,有不同的体会。正如卢彦所说的一样:通过研究Duwamish示例,高手能够领悟到.Net应用架构的设计思想,低手能够学习到.Net的编程技巧,实在是老少皆宜。
 
因此,这里再次学习并体验一次Duwamish范例。
 
1Duwamish 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页面获取CategoryDescription的整个调用过程。
1)实例化ProductSystem对象
2)调用ProductSystemGetCategories()方法
3)检测参数的合法性
4)创建Categories::DataAccess对象实例
5)返回上述对象
6)调用Categories::DataAccess对象的GetCategories()方法
7)创建CategoryData::Common对象实例
8)返回上述对象
9)返回CategoryData::Common对象实例,该实例中已经包含了需要的数据
10)返回CategoryData::Common对象实例给web/Client
11)检测数据的合法性
12)读取并显示结果:CategoryDescription

SystemFramework项目包含一些application需要的配置参数,ApplicationLog日志类和ApplicationAssert参数校验类。SystemFramework项目为所有其他的项目所引用。
 
Common项目包含了用于在各层间传递信息的数据集,如上述的CategoryData继承System.Data.DataSet,既不是所谓的typed DataSet,也不是一般的DataSet,不过简单实用,这是基于.Net Remoting开发分布式系统用来tiertier之间交互数据的一种方法。Common项目也被其他的项目引用,SystemFramework项目除外。
 
BusinessFacade项目中所有的Classes继承MarshalByRefObject class,显然是让准备将BusinessFacade tier部署为Remote Objects。不过,实际上默认这里并没有将其部署为Remote ObjectsWeb层仍然调用本地对象(《Duwamish部署方案篇》将分析这个问题)。
 
3Summary
 
在开发基于.Net Framework企业级分布式系统时,上述架构值得推荐,但也并非完美无暇,实际上存在一些值得改进的地方。显然,不可能一个范例适合所有的实际情况么,要求太苛刻了。其实,Enterprise Samples中的另外一个范例Fitch and Mather 7.0,其架构和Duwamish就有些不同了。
 
如果是开发本地的系统,就不要模仿Duwamish架构(看看上面获取CategoryDescription调用过程就知道了,太费劲。),如Business FacadeBusiness RulesClasses应采用fine-grained interface设计,层与层之间的交互参数也不必全部采用DataSet,适当的时候采用setter/getter就可以了,这样不仅可以提高开发效率,而且有助于提高performance, maintainability and reusability
 
 
References:
2, MSDN, Duwamish

 

 

Duwamish深入剖析-结构篇
作者: 卢彦   www.ASPCool.com 时间:2003-4-6 16:10:55  阅读次数:10195

     摘要:
  
  本文深入详细的介绍了Duwamish网上电子书店例程的结构框架,并详细的分析了该结构的若干特点和设计模式。
  
  
  --------------------------------------------------------------------------------
  
  目录:
  
  引言
  
  Duwamish介绍
  
  结构分析
  
  设计思想
  
  代码示例
  
  总结
  
  作者
  
  
  --------------------------------------------------------------------------------
  
  引言:
  
  能够作为Visual Studio .Net附带的例子,Duwamish一定包含了微软.Net设计队伍希望向开发者传达的某些信息,而事实上,Duwamish也的确能够称作是一个.Net开发者学习的经典示例,无论是从其设计架构,编程技巧或代码风格,都向我们展示了一个标准的.Net企业级应用程序所应该具有的特点。所以,通过研究Duwamish示例,高手能够领悟到.Net应用架构的设计思想,低手能够学习到.Net的编程技巧,实在是老少皆宜。 :)
  
  不过,本文的目的更多的是针对中级.Net学习者,这类读者往往已经熟悉了C#或者是VB.NET的语法,会用一些基本的类库,并已经会做一些比较小的程序。但是当他们开始着手开发一个真正具有实用价值的企业级应用的时候,却有种无处下手的感觉。如果你正巧属于这类学习者,请跟着我深入到Duwamish的世界中去,相信你一定会得到收获。
  
  
  --------------------------------------------------------------------------------
  
  Duwamish介绍:
  
  Microsoft公司每次推出新技术,总是会相应的推出一些公开源代码的应用范例来说明该项新技术的特点,而开发者也能通过研究该范例的代码来达到迅速掌握新技术并与以实施的目的。Microsoft通过对一个虚拟的在网上销售图书的电子商务公司网上销售系统应用的创建,向用户展现了典型的网上购物实践中最为普遍的电子商务企业对客户 (B2C) 模式,它包括成员资格、帐户管理、购物车、搜索和结帐过程等基本功能。Duwamish经历了三个版本4.0,5.0和7.0版,每一个版本的发布都印证了技术进步的过程,每一个版本都代表了当时最先进的技术动向。这里将要研究和讨论的是Duwamish的最高版本7.0版,经历了COM/COM+技术以及Microsoft DNA架构的Duwamish,在最新的版本中完全采用了.Net技术及架构,比以前显得更加先进和成熟。
  
  
  
  
  如果您安装了Visual Studio .Net的话,您可以在您的VS.Net 的Enterprise Samples目录下找到并安装它,例如:C:/Program Files/Microsoft Visual Studio .NET/Enterprise Samples/,或者您还可以到http://astradigital.com/Duwamish7Vb/这个地址去看看它在Internet的一个演示实例。其它有关Duwamish的详细介绍资料请参考Visual Studio .Net附带的MSDN帮助,地址是:ms-help://MS.VSCC/MS.MSDNVS.2052/dwamish7/html/vtoriDuwamishBooks70.htm,这里不再赘述。
  
  
  --------------------------------------------------------------------------------
  
  Duwamish结构分析:
  
  Duwamish 7.0 是一个典型的N层架构,其结构分为四个逻辑层:
  
  Web 层
  
  Web 层为客户端提供对应用程序的访问。这一层是作为 Duwamish.sln 解决方案文件中的 Web 项目实现的。Web 层由 ASP.NET Web 窗体和代码隐藏文件组成。Web 窗体只是用 HTML 提供用户操作,而代码隐藏文件实现各种控件的事件处理。
  
  业务外观层
  
  业务外观层为 Web 层提供处理帐户、类别浏览和购书的界面。这一层是作为 Duwamish.sln 解决方案文件中的 BusinessFacade 项目实现的。业务外观层用作隔离层,它将用户界面与各种业务功能的实现隔离开来。除了低级系统和支持功能之外,对数据库服务器的所有调用都是通过此程序集进行的。
  
  业务规则层
  
  业务规则层是作为 Duwamish.sln 解决方案文件中的 BusinessRules 项目实现的,它包含各种业务规则和逻辑的实现。业务规则完成如客户帐户和书籍订单的验证这样的任务。
  
  数据访问层
  
  数据访问层为业务规则层提供数据服务。这一层是作为 Duwamish.sln 解决方案文件中的 DataAccess 项目实现的。
  
  比较令人困惑的是其中的业务外观层和业务规则层,很多人在学习N层结构开发的时候,听得最多的是三层结构,分别为:表示层,中间层和数据层。Duwamish的WEB层和数据访问层比较好理解,也就是传统意义上的表示层和数据层,那么业务外观层和业务规则层和我们熟悉的中间层有什么联系呢?
  
  
  --------------------------------------------------------------------------------
  
  设计思想:
  
  在Web应用程序中,有部分操作只是简单的从数据库根据条件提取数据,不需要经过任何处理,而直接将数据显示到网页上,比如查询某类别的图书列表。而另外一些操作,比如计算定单中图书的总价并根据顾客的级别计算回扣等等,这部分往往有许多不同的功能的类,操作起来也比较复杂。我们可以先想象一下,如果我们采用三层结构,这些商业逻辑一般是会放在中间层,那么对内部的这些大量种类繁多,使用方法也各异的不同的类的调用任务,就完全落到了表示层。这样势必会增加表示层的代码量,将表示层的任务复杂化,和表示层只负责接受用户的输入并返回结果的任务不太相称,并增加了层与层之间的耦合程度。
  
  为了解决这个问题,我们先来看看《设计模式》一文中对Facade模式的描述:
  
  意图:
  
  为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
  
  适用性:
  
  当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过Facade层。
  
  客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
  
  当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过Facade进行通讯,从而简化了它们之间的依赖关系。
  
  结构图:
  
  
  
  
  上文提出的这个矛盾,正好和设计模式中Facade模式中所描述的需要解决的问题非常吻合,在《设计模式》中提出的解决的办法就是引入一个Facade对象,让这个Façade来负责管理系统内部类的调用,并为表示层提供了一个单一而简单的接口。这个Façade对象,在我们的Duwamish的设计中,就是BusinessFacade(业务外观)层。
  
  以下是Duwamish的结构关系图:
  
  
  
  
  我们从图中可以清楚的看到,浏览器首先调用的是表示层WEB,然后WEB将请求发送给业务外观层,业务外观层对请求进行初步的处理,判断是否需要调用业务规则层,还是直接调用数据访问层获取数据。最后由数据访问层访问数据库并按照来时的步骤返回结果到浏览器(对于图中涉及到其它的结构模块以后会分别予以详细介绍)。
  
  
  --------------------------------------------------------------------------------
  
  代码示例:
  
  以下是两种不同处理路径的代码示例:
  
  获取商品目录
  
  表示层调用业务外观层:
  
  productSystem = new ProductSystem();
  
  categorySet = productSystem.GetCategories(categoryID);
  
  业务外观层直接调用数据层:
  
  public CategoryData GetCategories(int categoryId)
  {
   if ( dsCommand == null )
   {
   throw new System.ObjectDisposedException( GetType().FullName );
   }
   return FillCategoryData("GetCategories", "@CategoryId", categoryId);
  }
  
  添加定单
  
  表示层调用业务外观层:
  
  public void AddOrder()
  {
   ApplicationAssert.CheckCondition(cartOrderData != null, "Order requires data", ApplicationAssert.LineNumber);
   ApplicationLog.WriteTrace("Duwamish7.Web.Cart.AddOrder:/r/nCustomerId: " +
   cartOrderData.Tables[OrderData.CUSTOMER_TABLE].Rows[0][OrderData.PKID_FIELD].ToString());
   cartOrderData = (new OrderSystem()).AddOrder(cartOrderData);
  }
  
  业务外观层调用业务规则层:
  
  public OrderData AddOrder(OrderData order)
  {
   ApplicationAssert.CheckCondition(order != null, "Order is required", ApplicationAssert.LineNumber);
  
   (new BusinessRules.Order()).InsertOrder(order);
   return order;
  }
  
  业务规则层调用数据层:
  
  public bool InsertOrder(OrderData order)
  {
   //此处省略复杂的处理逻辑
   if ( isValid )
   {
   using (DataAccess.Orders ordersDataAccess = new DataAccess.Orders())
   {
   return (ordersDataAccess.InsertOrderDetail(order)) > 0;
   }
   }
   else
   return false;
  }
  
  
  --------------------------------------------------------------------------------
  
  总结:
  
  通过分析Duwamish7的结构设计,我们掌握了Façade模式,并学习到了如何通过Façade模式对应用结构进行改进,同时了解了Duwamish7的基本概念和处理流程,为以后深入分析和学习Duwamish7的的其它部分打下了一个基础。

抱歉!评论已关闭.