WCF 服务库: WCF 服务应用程序的良好方法
WCF 服务库:
引言
在创建 WCF 项目时,将所有实际实现放入 WCF 库是一个很好的架构方法,然后在一个单独的 WCF 服务应用程序项目或非 WCF 项目中使用该库。因此,WCF 库可以在许多其他地方被重用,无论是由于另一个非 WCF 库/项目中的常规类引用,还是由于不同的 WCF 部署策略,无论是通过 IIS 中的 Web 服务、Windows 服务还是命令行启动。本文首先介绍在 WCF Web 服务应用程序中使用 WCF 服务库的一些简单步骤。稍后在讨论部分,它将详细说明这样做的原因。
本文的重点是试图推广这种看似简单但却被忽略的良好方法。对于大多数开发人员来说,这种看似简单的方法总是被忽视。在我看来,所有现有的 WCF Web 应用程序,我很少看到一个是通过 WCF 库方法实现的。在阅读了本文讨论部分关于使用 WCF 库的详尽原因后,希望开发人员能认真对待这种方法并从此使用它。
Visual Studio 2010 模板自动生成的代码将用作示例代码,稍作修改,以便读者可以轻松地重现它们。
使用代码和步骤
名为“WcfServiceLibrary
”的示例 WCF 服务库项目是通过 Visual Studio 2010 WCF 服务库模板自动生成的,无需任何修改。现在,让我们在一个名为“WcfWebService
”的 WCF 服务 Web 应用程序项目中将其用起来。下面是简单的步骤
- 在 Visual Studio 2010 中,使用 VS 2010 的 WCF 服务应用程序模板创建一个名为“
WcfWebService
”的 WCF 示例 Web 服务应用程序项目。 - 在项目 `WcfWebService` 的解决方案视图下,通过“References->Add References->Projects”添加对项目 `WcfServiceLibrary` 的引用,或者通过“References->Add References->Browser”添加对其 DLL 的引用。
- 在项目 `WcfWebService` 的解决方案视图下,删除 `IService1.cs`,然后删除 `Service1.svc` 下的 `Service1.svc.cs`,因为我们将使用 `WcfServiceLibrary` 中的服务实现。但保留 `Service1.svc`。
- 在项目 `WcfWebService` 的解决方案视图下,双击 `Service1.svc` 打开它,替换其以下标记行
<%@ ServiceHost Language="C#" Debug="true" Service="WcfWebService.Service1" CodeBehind="Service1.svc.cs" %>
替换为以下标记行
<%@ ServiceHost Language="C#" Debug="true" Service="WcfServiceLibrary.Service1" %> <%@ Assembly Name="WcfServiceLibrary" %>
保存项目 `WcfWebService`,然后完成。
测试
以下是在 VS 2010 中测试 WCF Web 服务项目的步骤
- 重新生成项目 `WcfServiceLibrary` 和 `WcfWebService`。
- 在解决方案视图下右键单击 `WcfWebService` 项目,然后选择 Debug->Start new instance,浏览器将启动此应用程序。
- 在启动的网页中,单击链接 `Service1.svc`,将显示 `Service Service1` 的帮助页面。
讨论
您可能会争辩:如果我只在 Web 服务应用程序中使用 WCF 库,为什么还要将所有 WCF 实现都放入 WCF 库中?答案是您仍然需要使用 WCF 库方法。这样做的原因如下:
- 现实是多变的;事情总是会超出您的预测。今天您还在处理一个项目,明天您可能会离开它去做一个新项目。接手您项目的人可能想重构或重新架构它以适应另一种 WCF 部署策略。
- 即使您还在这个项目中,需求也可能发生变化,以至于您必须重新架构您的项目以适应不同的 WCF 部署策略。例如,如果 Web 服务良好的可伸缩性在您的应用程序中不重要,您可以将 Web 服务部署转移到 Windows 服务部署,以便于安全处理和维护。
- 应用程序通常需要不时地重新架构和重新实现,以适应不断变化的世界和新技术。这似乎是所有我遇到的应用程序都不可避免的:从 JDK1.0 到 J2EE 6.0,从 Borland Delphi 和 Microsoft Visual Studio 6 到 Microsoft Visual Studio 2010/.NET 4。在这个过程中,库是最容易重用或从一种架构移植到另一种架构的东西。我们应该设计和开发准备好应对变化的东西。
- 不要使架构过于僵化;解耦和分离是一个良好且基本的设计原则。WCF 实现和部署是两个不同的任务类别,在良好的架构原则方面应该解耦。将所有 WCF 实现封装到 WCF 库中只是这种解耦的一个非常好的匹配。此外,WCF 服务接口通常包含一些高级功能,这实际上是一个服务外观层。这个高级服务外观层很可能需要在某个地方、以某种方式、以某些方式被重用。
一个新项目可能需要与 WCF 服务相同的操作,但出于某些原因不想以 WCF 服务的方式访问它。在这种类型的项目中,重用现有的 WCF 库就像使用常规类库一样,将节省重新发明轮子的精力。特别是,如果 WCF 库包含一些好的重量级外观操作,例如处理 ADO.NET 数据库域层的操作。在这种类型的项目中会出现几种情况:
- 预算有限的小型单体项目
- 用于适应遗留应用程序的项目
- 针对独立或离线平台且不需要多层架构的单体项目
我曾多次在单体或非 WCF 环境中遇到需要重用 WCF 服务库的情况。好消息是我总是使用 WCF 库方法。
有一种误解认为 WCF 库只能被 WCF 服务应用程序项目使用。这是不正确的。WCF 库可以像使用常规 .NET 库一样被任何其他类型的 .NET 项目使用。例如,在本文附带的演示解决方案中,WPF 项目 `WPFAppUsingWCFLib` 以与使用常规类库相同的方式使用 `WcfServiceLibrary`。您可以通过其文件夹启动 `WPFAppUsingWCFLib` 来测试这一点:`WPFAppUsingWCFLib\bin\Debug\WPFAppUsingWCFLib.exe`。不要通过 Visual Studio 2010 启动 `WPFAppUsingWCFLib` 项目,因为 Visual Studio 仍将在其 WCF 开发环境中将 `WcfServiceLibrary` 托管为 WCF 服务,并让 `WPFAppUsingWCFLib` 项目使用 WCF 服务。
更多
要将 `WcfWebService` 项目进一步部署到 IIS,您需要修改 `WcfWebService` 项目中的 `web.config`,就像处理常规 WCF 服务应用程序部署一样。
结论
使用 WCF 库是任何 WCF 项目的一个好方法,因为这样做可以使 WCF 服务实现代码在不同的实际场景下轻松灵活地重用。而且,在 WCF Web 服务应用程序中使用 WCF 库是可行且简单的。
历史
- 2011 年 2 月 9 日:初始帖子