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

简介:

概述

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

添加Business modules

在业务模块中,可以添加任何与特定业务有关的应用,可以有页面显示,用户控件、工作流、业务实体、数据访问等,如下图所示:
 
添加一个新的业务模块,在解决方案管理器右键菜单中,选择Web Client Factory->Add Business Module,如下图所示:
 
这里我们添加一个Products业务模块
 
将会出现创建业务模块向导界面,在这里我们选中Create Project for Unit Tests选项,将会为我们自动创建一个针对该业务模块的单元测试项目
 
创建完成后,可以在解决方案管理器中,看到如下结构:
 
可以看到,在网站中创建与业务模块的名称相同的新顶层子目录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模块,并且提供了一个默认的视图:
 

添加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一起结合使用,限于篇幅,我把视图、表示器放在下一篇中。












本文转自lihuijun51CTO博客,原文链接:http://blog.51cto.com/terrylee/67730  ,如需转载请自行联系原作者

相关文章
|
3月前
|
前端开发 JavaScript UED
在数字化时代,Web 应用性能优化尤为重要。本文探讨了CSS与HTML在提升Web性能中的关键作用及未来趋势
在数字化时代,Web 应用性能优化尤为重要。本文探讨了CSS与HTML在提升Web性能中的关键作用及未来趋势,包括样式表优化、DOM操作减少、图像优化等技术,并分析了电商网站的具体案例,强调了技术演进对Web性能的深远影响。
59 5
|
6月前
|
Java Maven Apache
Struts 2 配置不再难!跟着这篇详解从零搭建开发环境
【8月更文挑战第31天】要搭建Struts 2开发环境,需先安装JDK,然后下载并解压Struts 2二进制包,将其核心库`struts2-core`添加到项目类路径中。使用Maven或Gradle时,可在配置文件中添加依赖。接着,在`web.xml`中配置Struts 2过滤器及其映射。`struts.xml`通常位于`src/main/resources`目录下,用于定义动作映射和拦截器等核心配置。最后,通过配置类路径下的`log4j.properties`文件,可以设置Struts 2的日志记录级别及输出方式。完成以上步骤后,即可开始基于Struts 2框架进行Web应用开发。
268 0
|
6月前
|
开发者 前端开发 Java
架构模式的诗与远方:如何在MVC的田野上,用Struts 2编织Web开发的新篇章
【8月更文挑战第31天】架构模式是软件开发的核心概念,MVC(Model-View-Controller)通过清晰的分层和职责分离,成为广泛采用的模式。随着业务需求的复杂化,Struts 2框架应运而生,继承MVC优点并引入更多功能。本文探讨从MVC到Struts 2的演进,强调架构模式的重要性。MVC将应用程序分为模型、视图和控制器三部分,提高模块化和可维护性。
59 0
|
6月前
|
Java Spring Maven
Struts 2遇见Spring:这个组合如何颠覆你的Web开发?
【8月更文挑战第31天】在现代Web开发中,Struts 2与Spring的结合使用能显著增强应用的模块化和可维护性。本文将介绍如何整合这两个框架,并提供代码示例。首先,在`pom.xml`中添加Struts 2和Spring的依赖,然后在`struts.xml`中配置Struts 2以识别Spring插件。接着,在Spring配置文件中定义bean,并在Struts 2的Action类中使用`@Autowired`注解进行自动注入。
98 0
|
6月前
|
Java 数据库连接 数据库
强强联手!JSF 与 Hibernate 打造高效数据访问层,让你的应用如虎添翼,性能飙升!
【8月更文挑战第31天】本文通过具体示例详细介绍了如何在 JavaServer Faces (JSF) 应用程序中集成 Hibernate,实现数据访问层的最佳实践。首先,创建一个 JSF 项目并在 Eclipse 中配置支持 JSF 的服务器版本。接着,添加 JSF 和 Hibernate 依赖,并配置数据库连接池和 Hibernate 配置文件。然后,定义实体类 `User` 和 DAO 类 `UserDAO` 处理数据库操作。
76 0
|
6月前
|
开发者 前端开发 Apache
【绝不错过!】揭秘Wicket大神级插件,带你飞越编程极限,探索Web应用开发新大陆!
【8月更文挑战第31天】Apache Wicket是一个成熟的Java Web框架,以其组件化体系结构、直观的API及对MVC的支持著称。其活跃社区贡献了大量插件和扩展,显著提升了Wicket的功能性。本文推荐几个实用插件,如**Wicket Ajax Support**,可轻松添加Ajax功能,提升用户体验;**Bootstrap for Wicket**则将Bootstrap与Wicket结合,美化应用界面。
65 0
|
6月前
|
SQL 安全 JavaScript
深入剖析Blazor应用的安全性:从常见Web攻击谈起与传统Web应用的对比与防护策略
【8月更文挑战第31天】本文探讨了Blazor应用的安全策略,通过与传统Web应用的安全措施进行比较,详细分析了如何防范常见的网络攻击。首先介绍了Blazor框架如何通过其基于组件的模型和服务器端DOM控制来减少跨站脚本攻击的风险;接着讨论了使用ORM工具如Entity Framework来预防SQL注入攻击的方法;最后分析了跨站请求伪造攻击,并说明了在Blazor应用中如何利用AntiforgeryToken增强安全性。尽管Blazor提供了许多内置的安全防护,但开发者仍需结合良好的编程习惯来全面保护应用。
78 0
|
6月前
|
缓存 前端开发 JavaScript
Angular邂逅PWA:一场关于如何利用现代Web技术栈中的明星框架与渐进式理念,共同编织出具备原生应用般丝滑体验、离线访问及桌面集成能力的未来Web应用的探索之旅
【8月更文挑战第31天】本文详细介绍如何利用Angular将传统Web应用升级为渐进式Web应用(PWA),克服后者在网络依赖、设备集成及通知功能上的局限。通过具体命令行操作与代码示例,指导读者从新建Angular项目到配置`manifest.json`和服务工作进程,最终实现离线访问、主屏添加及推送通知等功能,显著提升用户体验。适合各水平开发者学习实践。
67 0
|
6月前
|
数据库连接 数据库 开发者
【独家揭秘】零基础小白如何逆袭?——这份Web2py入门秘籍让你轻松打造个人首个Web应用,绝不错过!
【8月更文挑战第31天】本文通过实际操作指导读者从零开始使用Web2py框架创建首个Web应用。内容涵盖环境搭建、数据库模型定义、控制器与视图设计等核心环节。通过一步步详细说明,帮助开发者掌握关键概念与最佳实践,实现应用从创建到部署的全过程。适合初学者快速上手并应用于实际项目中。
79 2
|
6月前
|
数据库 开发者 Python
【绝技揭秘】如何用Web2py玩转数据库?打造数据驱动Web应用的五大绝招!
【8月更文挑战第31天】本文通过具体示例介绍如何使用Web2py这款强大的Python Web框架进行数据库操作,创建数据驱动的Web应用。从创建应用、定义数据库模型到实现CRUD操作,逐步演示了如何构建一个简单的博客系统,包括文章列表页和详情页,并提供表单让用户创建新文章。通过本文,你将学会利用Web2py简化数据库交互,提升开发效率。
64 0

热门文章

最新文章

  • 1
    打造高效的Web Scraper:Python与Selenium的完美结合
    13
  • 2
    Burp Suite Professional 2025.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
    26
  • 3
    AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
    20
  • 4
    【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
    54
  • 5
    部署使用 CHAT-NEXT-WEB 基于 Deepseek
    342
  • 6
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    26
  • 7
    java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
    40
  • 8
    零基础构建开源项目OpenIM桌面应用和pc web- Electron篇
    28
  • 9
    【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
    22
  • 10
    FastAPI与Selenium:打造高效的Web数据抓取服务 —— 采集Pixabay中的图片及相关信息
    55