Web Client Software Factory系列(2):Composite Web应用程序块

概述

使用Composite Web应用程序块的好处是能够将一个主站点拆分为多个独立的模块,每个模块负责主站点中一个目录及其所有内容。多个开发人员分别独立负责不同的模块而不会相互干涉。

添加Business modules

在业务模块中,可以添加任何与特定业务有关的应用,可以有页面显示,用户控件、工作流、业务实体、数据访问等,如下图所示:

TerryLee_WCSF07

添加一个新的业务模块,在解决方案管理器右键菜单中,选择Web Client Factory->Add Business Module,如下图所示:

TerryLee_WCSF06

这里我们添加一个Products业务模块

TerryLee_WCSF08

将会出现创建业务模块向导界面,在这里我们选中Create Project for Unit Tests选项,将会为我们自动创建一个针对该业务模块的单元测试项目

TerryLee_WCSF09

创建完成后,可以在解决方案管理器中,看到如下结构:

TerryLee_WCSF10

可以看到,在网站中创建与业务模块的名称相同的新顶层子目录Products,并且在 Modules 目录下创建新的类库项目。该类库项目用于包含与 /Products目录下的一组页面相关联的任意业务逻辑。它包含表示器类 (DefaultViewPresenter) 和接口 (IDefaultView) 的定义,用于定义要由 /Products目录下的 Default.aspx 页面实现的视图的方法。顶层控制器类也是在该项目中定义的,该类与视图和表示器类相结合可完成此模块的页面逻辑。还有一个ProductsModuleInitializer.cs 文件,其中包含一个从 ModuleInitializer 继承的 ProductsModuleInitializer 类,此类定义将在首次加载网站时调用的初始化方法,并且它为模块提供了初始化任意数据、注册站点映射信息等的方法。模块通过添加到 /Products 子目录下的 web.config 文件关联到网站加载,该子目录包含描述此模块的名称、程序集和 URL 的复合 Web/模块下的条目:

<configuration>
<configSections>
<sectionGroup name="compositeWeb">
<section name="modules" type="Microsoft.Practices.CompositeWeb.Configuration.ModulesConfigurationSection, Microsoft.Practices.CompositeWeb"/>
<section name="authorization" type="Microsoft.Practices.CompositeWeb.Configuration.AuthorizationConfigurationSection, Microsoft.Practices.CompositeWeb"/>
</sectionGroup>
</configSections>
<compositeWeb>
<modules>
<module name="Products" assemblyName="Products" virtualPath="~/Products">
<dependencies>
<dependency module="Shell" />
</dependencies>
</module>
</modules>
<authorization>
    </authorization>
</compositeWeb>
<appSettings/>
<connectionStrings/>
<system.web />
</configuration>
现在我们运行程序后,可以看到,已经在左边的导航树中添加Products模块,并且提供了一个默认的视图:
TerryLee_WCSF11 

添加Service

为了后面的实现View-Presenter模式,这里我们先添加一个Service。分别添加Product实体、IProductDataService接口、ProductDataService实现,如下代码示例:

Product实体:
public class Product
{
private string _name = string.Empty;
private string _brand = string.Empty;
/// <summary>
/// 名称
/// </summary>
public string Name
{
get { return _name; }
set { _name = value; }
}
/// <summary>
/// 品牌
/// </summary>
public string Brand
{
get { return _brand; }
set { _brand = value; }
}
}

IProductDataService接口:

public interface IProductDataService
{
Product GetProductById(string id);
}

ProductDataService实现,这里根据ID从数据库中读取

public class ProductDataService : IProductDataService
{
public Product GetProductById(string id)
{
// 这里根据ID从数据库中读取:)
Product product = new Product();
product.Name = "Computer";
product.Brand = "Lenovo";
return product;
}
}

注册服务和使用服务

在ProductsModuleInitializer.cs中我们可以找到AddModuleServices、AddGlobalServices这样两个方法,如果要添加的服务只在当前模块中使用,可以使用AddModuleServices,如果添加的服务在其他模块中也可以使用,使用AddGlobalServices方法。

protected virtual void AddModuleServices(IServiceCollection moduleServices)
{
moduleServices.AddNew<ProductDataService, IProductDataService>();
}

注册完服务后,就可以用Dependency Injection来使用服务了,通过ServiceDependency特性来实现,打开ProductsController.cs,添加如下代码:

public class ProductsController
{
public ProductsController()
{
}
private IProductDataService _productDataService;
[ServiceDependency]
public IProductDataService ProductDataService
{
set { _productDataService = value; }
}
public virtual Product GetProductById(string id)
{
return _productDataService.GetProductById(id);
}
}

除了上面的方法之外,ServiceDependency特性还可以直接应用于方法的参数之上,如下代码所示:

public class ProductsController
{
public ProductsController
(
[ServiceDependency] IProductDataService productDataService
)
{
this._productDataService = productDataService;
}
private IProductDataService _productDataService;
public virtual Product GetProductById(string id)
{
return _productDataService.GetProductById(id);
}
}

结束语

Composite Web应用程序块在Web Client Software Factory中经常与View-Presenter一起结合使用,限于篇幅,我把视图、表示器放在下一篇中。

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2007-11-26 20:23 TerryLee 阅读(4195) 评论(39)  编辑 收藏 所属分类: Software Factory

  回复  引用  查看    
#1楼 2007-11-26 20:58 | 菌哥      
good!
  回复  引用  查看    
#2楼 2007-11-26 21:27 | 暗香浮动      
很久不见了。
very good
  回复  引用  查看    
#3楼 [楼主]2007-11-26 21:54 | TerryLee      
@菌哥
:)
  回复  引用  查看    
#4楼 [楼主]2007-11-26 21:54 | TerryLee      
@暗香浮动
确实好久没有更新了:)
  回复  引用    
#5楼 2007-11-26 22:44 | 废铜回收 [未注册用户]
暗香浮动
  回复  引用    
#6楼 2007-11-26 22:45 | 上海搬家公司 [未注册用户]
very good
  回复  引用    
#7楼 2007-11-26 22:45 | 厂房出租 [未注册用户]
Composite Web应用程序块在Web Client Software Factory中经常与View-Presenter一起结合使用,限于篇幅,我把视图、表示器放在下一篇中。
  回复  引用    
#8楼 2007-11-26 22:46 | 包装机 [未注册用户]
与View-Presenter一起结合使用
  回复  引用  查看    
#9楼 [楼主]2007-11-26 22:50 | TerryLee      
@废铜回收
@厂房出租
@包装机


//广告?
  回复  引用  查看    
#10楼 [楼主]2007-11-26 22:50 | TerryLee      
@上海搬家公司
:)
  回复  引用  查看    
#11楼 2007-11-26 23:09 | Jeffrey Zhao      
基本上看懂了这部分逻辑,以及它是如何依赖注入的了。
但是我想,现在的应用逻辑越来越复杂,很可能某两个Module最后会需要产生关系——这该怎么办呢?
  回复  引用  查看    
#12楼 2007-11-27 00:27 | Colin Han      
那些确实就是广告,删了吧。
谁让你的名气大呢。
呵呵,顺便连我也删了。
  回复  引用  查看    
#13楼 2007-11-27 00:31 | Colin Han      
其实,我倒真的有些不太明白了。WCSF和MVC什么关系。
我记得你在上一篇博客里提到,WCSF是模型,参考等等,MVC是具体的技术实现。但是,至少目前的这些内容似乎和MVC面向的方面很类似啊。
期待你精彩的下文。

另外,有没有结合的使用WCSF和WSSF的。看起来他们两个的重合部分有点多,不知道微软是打算怎么整合这三个东西。我一向最佩服微软的整合能力。
  回复  引用  查看    
#14楼 2007-11-27 08:26 | Enzo      
@Colin Han
hehe.

  回复  引用  查看    
#15楼 [楼主]2007-11-27 08:34 | TerryLee      
@Jeffrey Zhao
MSN上我们已经讨论了,期待下次讨论啊:)
  回复  引用  查看    
#16楼 [楼主]2007-11-27 08:38 | TerryLee      
@Colin Han
简单说吧,WCSF是一个指南,指导我们如何使用V-P模式、Composite Web Application Block进行Web站点开发。

//后面有时间我写写WSSF
  回复  引用  查看    
#17楼 2007-11-27 08:52 | 阿不      
就是不知道这玩意儿与将要发布的MVP框架有什么联系?
  回复  引用  查看    
#18楼 2007-11-27 09:01 | Clark Zheng      
@阿不
这个就是MVP框架,将要发布的是MVC框架
  回复  引用  查看    
#19楼 [楼主]2007-11-27 09:12 | TerryLee      
@Clark Zheng
不会吧?这玩意儿怎么会跟将要发布的MVC框架是同一个东东呢?
  回复  引用  查看    
#20楼 2007-11-27 09:27 | Clark Zheng      
@TerryLee
- -!,我是对那个阿不说的,这个Web Client Software Factory不就是MVP框架吗?而那个MVC框架不是就要发布了吗?
  回复  引用  查看    
#21楼 [楼主]2007-11-27 09:57 | TerryLee      
@Clark Zheng
看错了-_-:)
  回复  引用  查看    
#22楼 2007-11-27 10:13 | 老夫子系      
--引用--------------------------------------------------
Jeffrey Zhao: 基本上看懂了这部分逻辑,以及它是如何依赖注入的了。
但是我想,现在的应用逻辑越来越复杂,很可能某两个Module最后会需要产生关系——这该怎么办呢?
--------------------------------------------------------

Module是不能产生关系的,如果一个module确实需要调用另一个module,则通过调用另一个module的Service来实现。也就是Module之间不产生关系,产生关系的是Module跟Service。比如,ModuleA调用ServiceB。
  回复  引用  查看    
#23楼 2007-11-27 10:50 | winnerzone      
这个东西能构建多层吗?比如说我想将业务中的各个业务功能分成多层.是否可以构建呢?
  回复  引用  查看    
#24楼 2007-11-27 12:23 | a feng      
LZ,你的.NET设计模式系列文章 好像还没有全部写完麻
还继续吗?
  回复  引用  查看    
#25楼 2007-11-27 12:28 | 老夫子系      
这个是Web Client Software Factory, 关心的是如何让各自模块独立,如何单元测试。而不关心业务逻辑。
所有的业务逻辑,最后都是通过Service方式提供给Web Client Software Factory。
  回复  引用  查看    
#26楼 [楼主]2007-11-27 12:32 | TerryLee      
@winnerzone
构建多层肯定没问题,可以在每一个业务模块下构建,而且可以每个模块也可以不同:)
  回复  引用  查看    
#27楼 [楼主]2007-11-27 12:33 | TerryLee      
@a feng
我找时间尽量写完:)
  回复  引用  查看    
#28楼 [楼主]2007-11-27 12:34 | TerryLee      
@老夫子系
是不是和WSSF结合起来使用比较好呢?
  回复  引用    
#29楼 2007-11-27 15:16 | xyly [未注册用户]
GOOD。学习!
  回复  引用  查看    
#30楼 2007-11-28 13:08 | 紫色阴影      
@老夫子系
同意 模块通过service来交互,之间是不能产生耦合的
  回复  引用  查看    
#31楼 2007-11-28 22:00 | Hafeyang      
在vs2005 的项目菜单中没有" Add Client Factory "这么个选项?
急盼指教
  回复  引用  查看    
#32楼 [楼主]2007-11-28 22:12 | TerryLee      
@Hafeyang

有没有安装如下两项?
Guidance Automation Extensions
Guidance Automation Toolkit

  回复  引用  查看    
#33楼 2007-11-28 23:15 | Hafeyang      

知道了 高兴的学习ing...
  回复  引用    
#34楼 2007-12-03 18:21 | 投影机维修 [未注册用户]
没有安装如下两项
  回复  引用  查看    
#35楼 [楼主]2007-12-11 19:23 | TerryLee      
@投影机维修
没有安装不行啊
  回复  引用    
#36楼 2008-08-31 22:03 | fanrui [未注册用户]
你好
看了wcsf我有一个问题,
在我的websit里有两个模块,也就是A,B。也就是在webist下有两个文件夹A,B。我用wcsf建的时候首先在Modules增加一个A这样在websit里增加了一个A文件夹。我又在Modules增加了一个B,这样在webist里增加了一个B。但是在A里我想用到B里的一个函数,而在B里我又需要一个A的函数。我看了micfosoft的webcast里面的实例说哪个模块有1000多个模块。是不是这些逻辑模块不可以相互引用呢?
我在网上搜了很多但是没有找到。还有AddModuleServices、AddGlobalServices 这两个函数不太明白。这里的这个service我看你给的实例是在product模块内。是必须在products模块内嘛?如果是的话,有一个逻辑函数我继需要在A使用,又需要在B使用该怎么做呢?
谢谢
  回复  引用  查看    
#37楼 [楼主]2008-09-01 21:58 | TerryLee      
@fanrui
业务模块间其实是可以互相引用的,不能循环引用;但是如果你这样做的话,就失去了Composite的意义了。
既要在A里使用又要在B里使用,那就是不是业务模块,你应该添加Foundational Modules才是,而不是Business Modules。

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-03-02 10:50 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: