65.9K
CodeProject 正在变化。 阅读更多。
Home

WCF 示例 – 简介

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (82投票s)

2010 年 6 月 28 日

CPOL

9分钟阅读

viewsIcon

465911

downloadIcon

1268

使用 WPF、WCF 和 NHibernate 设计和开发富客户端企业应用程序的模式和最佳实践

Next
第一章

最新修改 

2013 年 5 月 28 日新增
我在 Azure 大赛上提交了一篇关于 LiteDispatch - 云端物流解决方案[^] 的文章。在这篇文章中,我使用了与本系列文章相同的模式。但不同的是,这是一个使用 EF Code First 的 MVC 4 应用程序示例;它讨论了如何使用 SQL-CE 将 MVC 应用程序集成到 Azure Web Sites 中,然后涵盖了如何让应用程序在 Azure SQL Server 上运行。它还包含了一些有趣的方面,例如 EF Migrations 以及对混合持久化配置的讨论,其中两个 EF 上下文被设置为在单个应用程序中运行。一个连接到 SQL-CE,另一个连接到 Azure SQL Server。此外,该项目是使用 EF Code First 和 SQL-CE 的 Simple Membership 的工作示例。该应用程序可在 http://litedispatch.azurewebsites.net/[^] 找到。

 

添加到本系列文章的最后一篇是 WCF by Example - 第 XVI 章 - EF 5 & SQL CE - Azure Web Sites 部署,这篇文章于 2013 年 2 月添加,讨论了如何在 eDirectory 解决方案中使用 Entity Framework Code First 实现 Unit of Work 和 Repository。这篇文章还讨论了如何将解决方案部署到 Azure Web Sites。

文章的源代码位于其在 Codeplex 上的独立项目中,最新的更改可以在 trunk 分支中找到。

2013 年 2 月,EF 支持被添加到解决方案中,我使用了 EF Code First 和 SQL-CE。

2012 年 12 月,RavenDB 支持被添加到解决方案中。

2012 年 10 月,对解决方案进行了修改,使其 NHiberante 也支持 SQL-CE 4.0;以前它只支持 SQL Server 或 Express 版本;您可能想查看一下,了解如何在 SQL-CE 和 NHibernate 中运行您的应用程序。

2010 年 12 月,应用程序的服务器端已部署到 Azure,一个即用型客户端可在 codeplex 上找到。WPF 客户端可以调用部署在 Azure 中的 WebRole 的方法。此源代码可以在 CodePlex 上找到:eDirectory.WPFClient.Azure.zip

您可以通过以下方式关注系列文章/代码更新: @enriquealbert/wcfbyexample

引言

本文是系列文章的第一篇,该系列文章讨论了如何使用 WCF 进行通信和 NHibernate 进行持久化来设计和开发 WPF 客户端。实际上,该解决方案可以配置为使用以下一种持久化实现:NHibernate、EF、InMemory 和 RavenDB。

设计企业应用程序需要一套全面的技能。在小型和中型项目中,时间和资源的分配可能不如大型项目可行,这时,最佳实践和模式的来源将非常有益。有大量的文章、书籍和其他材料涵盖了特定方面,但几乎不可能找到一个地方,将所有技术和模式结合使用,并提供对“为什么”和“如何”的全面讨论。

这些文章的目的是提供一个示例,说明如何从早期阶段开发一个完整的企业应用程序直至完全功能化。文章建立在彼此的基础上,新的方面被涵盖或/和现有的功能得到增强,从而将架构师的理念与业务的非功能性需求相协调。

本系列文章假设遵循敏捷实践,因此解决方案的架构师专注于为 RAD、DDD 和 TDD 方法论提供灵活的机制。架构师的一个关键方面是能够部署一个功能齐全的客户端以供业务探索,这需要最小的基础设施占用空间;避免数据库、部署到 IIS 等。

背景 

架构师的需求如下:

  • 使用 WPF 的富客户端 
  • 客户端使用 WCF 服务连接到服务器 
  • NHibernate、EF、RabenDB 用于持久化 
  • 客户端应用程序可以针对内存存储库运行(探索客户端)
  • 探索客户端的部署必须保持简单 
  • 应用程序必须易于测试,测试可以针对任何已实现的存储库运行

其他假设

  • 我们完全控制客户端和服务器组件
  • 我们从头开始创建数据库,不使用任何遗留数据库
  • 我们将使用 IIS7 和 WAS 部署服务器组件;我们将使用 TCP/IP
  • 我们对数据库表中的主键拥有完全的设计控制权,在本项目中,我们将为所有实体使用唯一的长整型字段

eDirectory 解决方案

我们将在本系列文章中从一个非常简单的业务场景开始,本系列文章的重点是架构而不是业务领域。如果我们发现需要探索更复杂的架构概念,将来可能会扩展我们的领域。

业务领域基于一个简单的联系人列表,目前非常简单,只需要一个实体:客户。解决方案名称为 eDirectory。

源代码可在 codeplex 上找到: WCF by Example  

最新版本可在 trunk 分支中找到,每个章节都位于其自己的 tag 分支中。您可能想使用 Codeplex 中的浏览功能在分支之间导航。

架构概述 

eDirectory 应用程序定义了三个截然不同的应用程序组件:数据库、服务器和客户端。

wcfbyexample_introduction/architecture_highlevel.gif

在客户端和服务器内部,应用程序被组织成层次结构,在大多数情况下,层次结构是并排堆叠的,连续的层次结构通过解耦机制提供,以便可以使用不同的实现。一些服务可以在多个层次结构中可用。

如前所述,我们完全控制客户端和服务器。因此,我们不依赖于后期服务发现,而是将服务合同放在应用程序的两端。DTOs 和一些通用的业务验证也是如此。因此,定义了一个 Common 程序集,其中包含服务器和客户端应用程序共享的组件。

wcfbyexample_introduction/common_components.gif

在服务器端,我们找到了核心组件,业务领域声明了业务实体及其行为(操作方法)。然后声明了暴露我们领域操作方法的服务。用于持久化和序列化约束的服务仅在客户端和服务器之间暴露 DTOs。因此,需要全面地处理实体到 DTOs 的转换。

为了将我们的业务领域与数据库解耦,存储库组件负责我们实体的持久化。我们将在这两个层之间定义一个通用的接口。有四种具体的存储库实现:内存、NHibernate、Entity Framework 和 RavenDB。

事务管理器是我们“工作单元”的实现。它负责我们的业务事务和业务消息(警告和异常)的处理。

wcfbyexample_introduction/server_components.gif

最后但同样重要的是,我们有客户端组件。客户端是一个使用 MVVM 模式设计的 WPF 应用程序。该模式提供了一个整洁的视图 XAML 组件,几乎没有代码隐藏,XAML 的绑定能力与 ViewModel 类相结合,提高了客户端渲染服务层提供的 DTOs 的方式。

客户端将服务层解耦为两个主要组件。适配器负责管理在服务执行期间检索到的业务消息。WCF 代理层负责管理 WCF 服务,设计精巧,是解耦客户端与 WCF 服务的好方法。

wcfbyexample_introduction/client_components.gif

Codeproject 上提供的文章

日期 文章
2010 年 6 月 28 日 WCF 示例 – 第一章 – 基线
2010 年 7 月 5 日 WCF by Example - 第二章 - Repository Locator
2010 年 7 月 10 日 WCF 示例 – 第三章 – 响应
2010 年 7 月 16 日 WCF 示例 – 第四章 – 事务管理器
2010 年 7 月 23 日 WCF 示例 – 第五章 – 上下文
2010 年 8 月 31 日 WCF by Example - 第六章 - Baseline MVVM
2010 年 9 月 4 日 WCF by Example - 第七章 - Contract Locator
2010 年 9 月 15 日 WCF by Example - 第八章 - Relay Command
2010 年 9 月 19 日 WCF by Example - 第九章 - Notify Property Change
2010 年 10 月 16 日 WCF by Example - 第十章 - DI with Spring.Net
2010 年 11 月 4 日 WCF 示例 – 第十一章 – NHibernate 实现
2010 年 11 月 24 日 WCF 示例 – 第十二章 – WCF 实现
2010 年 12 月 19 日 WCF by Example - 第十三章 - Business Domain Extension
2011 年 1 月 7 日 WCF 示例 – 第十四章 – 验证和异常管理
2012 年 12 月 16 日 WCF 示例 - 第 XV 章 - RavenDB 实现
2013 年 2 月 12 日 WCF 示例 – 第十六章 – EF 5 和 SQL CE – AzureWebSites 部署

Codeplex 上提供的章节(源代码)

日期 章节
2010 年 6 月 14 日 第一章 - Baseline
2010 年 6 月 14 日 第二章 - Response
2010 年 6 月 14 日 第三章 - Response
2010 年 6 月 14 日 第四章 - Transaction Manager
2010 年 6 月 14 日 第五章 - Service Locator
2010 年 6 月 14 日 第六章 - Baseline MVVM
2010 年 6 月 14 日 第七章 - Contract Locator
2010 年 7 月 29 日 第八章 - RelayCommand
2010 年 7 月 29 日 第九章 - Notify Property Changed Pattern
2010 年 7 月 29 日 第十章 - Dependency Injection
2010 年 9 月 12 日 第十一章 - NHibernate Implementation
2010 年 10 月 7 日 第十二章 - WCF Implementation
2010 年 11 月 14 日 第十三章 - Business Domain Extension
2010 年 12 月 12 日 Azure Solution - In-memory mode WebRole
2011 年 1 月 7 日 第十四章 - Validation & Exception Management
2011 年 10 月 7 日 Client re-factor: ServiceAdapter & CommandDispatcher pattern 
2012 年 12 月 16 日 RavenDB Implementation
2013 年 2 月 12 日 Entity Framework Implementation

未来章节 

章节 状态
Azure Deployment - In-memory WebRole 源代码可用

历史

2010 年 6 月 14 日 - 创建了简介文章。
2010 年 6 月 28 日 - 第一章完成,系列文章已发布。
2010 年 7 月 5 日 - 第二章已添加到系列文章中
2010 年 7 月 10 日 - 第三章已添加到系列文章中
2010 年 7 月 16 日 - 第四章已添加到系列文章中
2010 年 7 月 23 日 - 第五章已添加到系列文章中
2010 年 8 月 31 日 - 第六章已添加到系列文章中
2010 年 9 月 4 日 - 第七章已添加到系列文章中
2010 年 9 月 15 日 - 第八章已添加到系列文章中
2010 年 9 月 19 日 - 第九章已添加到系列文章中
2010 年 10 月 7 日 - 第十二章的源代码可在 CodePlex 上找到
2010 年 10 月 16 日 - 第十章已添加到系列文章中
2010 年 11 月 4 日 - 第十一章已添加到系列文章中
2010 年 11 月 24 日 - 第十二章已添加到系列文章中
2010 年 12 月 12 日 - In-memory WebRole 已部署到 MS Azure
2010 年 12 月 19 日 - 第十三章已添加到系列文章中
2011 年 1 月 7 日 - 第十四章已添加到系列文章中
2011 年 2 月 9 日 - 第十四章第 2 部分已添加到系列文章中
2011 年 10 月 7 日 - Client re-factor 已在 Codeplex 上提供
2012 年 10 月 20 日 - 向解决方案添加了 SQL-CE 4.0 支持
2012 年 12 月 16 日 - RavenDB implementation
2013 年 2 月 12 日 - Entity Framework implementation
2013 年 5 月 28 日 - 提及 Azure 中的 LiteDispatch MVC 项目 


© . All rights reserved.