【问题标题】:Contract-First SOA with WCF使用 WCF 的合同优先 SOA
【发布时间】:2010-11-06 00:55:29
【问题描述】:

这个问题更多的是探索人们在实际情况下在社区中所做的事情,而不是一个有针对性的问题。我对此进行了相当广泛的搜索,虽然我发现很多博客都提倡契约优先服务设计,并且一些 cmets 支持它们,但我还没有找到很多关于使用 WCF 实现契约优先的实用信息,利弊我最近对 ​​SOA 进行了一些广泛的研究,主要是通过 Thomas Erl 的书籍,他提倡的主要概念之一是契约优先设计。

我的问题如下:

  1. 您如何使用 .NET 和 WCF 进行合同优先服务设计?
  2. 除了 svcutil 之外,还有其他工具可以从合约生成客户端和服务吗? (任何与 VS 集成的都是理想的)
  3. 您在合同优先设计和 wCF 方面遇到过哪些现实世界的专业人士?
  4. 您在使用合同优先设计和 WCF 时遇到了哪些现实问题?

合约优先开发的主要问题之一似乎是工具。 Svcutil 是我发现的唯一可以从合约生成服务代码的东西,而且它的输出很差。它的单一文件,塞满了属性和代码生成工件,基本上需要在合约更新时重新生成和替换。我更喜欢更好的方法,最好是不需要 regen-replace 的方法。我什至可以手动创建服务端合同,假设它在现实世界的场景中是实用的。

编辑:

虽然 WCSF 解决了我的迫切需求,但了解 Protocol BuffersService Factory 都是有趣的工具,我相信它们将来会对我有所帮助。

【问题讨论】:

  • (回复评论/问题)
  • 使用WCSF Blue,是否可以先在WSDL中定义自定义策略,然后在Service和Client中生成对应的代码?

标签: .net wcf soa contract-first


【解决方案1】:

WSCF 提供具有 VS 集成的合约优先工具。看看这个。 (免费)

自 7 月 6 日起,有一个带有安装程序的二进制版本。

【讨论】:

  • 感谢您的链接,切索。这看起来很有希望。但是,该 CodePlex 站点上似乎没有下载。知道在哪里可以下载 WCSF.blue 吗?
  • 我向项目所有者投诉,他们告诉我他们“现在很快”会有一个可下载的二进制文件。现在你的选择是下载源代码并运行“msbuild”。
  • 我们目前正在使用 C# 3.0 在 .NET 3.5 SP1 上进行开发。这确实看起来很有希望。感谢您的输入!如果在赏金期结束之前没有比这更好的了,我想你已经把它装袋了。 :)
  • 我没有意识到那里有 赏金。呵呵。想知道我能把所有的积分花在什么上面!?!呃,那是什么?...它们不值钱吗?哦...
  • 实际上大约3小时前发布了下载。这有多先进?
【解决方案2】:

我使用契约优先的方法,通常(但不总是)在每一端使用相同的类型表示。

实际上,要使用 WCF,您不需要任何特殊的代理等;您可以在两端使用常规 .NET 类型,而不使用 svcutil.exe。获得一个工作服务就像在配置文件中添加“ABC”一样简单,并使用类似的东西:

public sealed class WcfClient<T> : System.ServiceModel.ClientBase<T>
    where T : class
{
    public T Service { get { return base.Channel; } }
}

现在你可以使用了:

using(var client = new WcfClient<IMyService>()) {
    int i = client.Service.SomeMethod("abc");
}

您在客户端(和服务器)上拥有的只是您的IMyService 接口。


对于其他工具; protobuf-net 是 Google 的“protocol buffers”API 的实现,它有一个 DSL,用于以“合同优先”(和可移植/可互操作)方式描述数据和服务 - 例如(一个 .proto 文件):

message SearchRequest {
  required string query = 1;
  optional int32 page_number = 2;
  optional int32 result_per_page = 3;
}
message SearchResponse {
  repeated string result = 1; 
}
service SearchService {
  rpc Search (SearchRequest) returns (SearchResponse);
}

protobuf-net 工具(由我维护)包括一个“protogen”实用程序,用于将此 DSL 转换为 C#/VB;并且其中一个选项(至少对于 C# - 我需要检查 VB)是发出完整的 WCF 代理实现(您可以选择同步或异步方法);与 svcutil 非常相似 - 但(由于 protobuf-net 关系)它在操作合同上包含自定义 [ProtoBehavior] 属性,因此它使用 protobuf-net 序列化程序而不是 DataContractSerializer (更快、更高效,但不同)。

用于 VS 集成;我正在努力解决这个问题 (proof)。

【讨论】:

  • 我实际上明确需要在每一端使用不同类型的能力。我试图解决的问题之一是构建解耦。现在,我们有几个相互依赖的域,它们需要更加独立。我们希望 WCF 帮助我们实现这一目标,以及面向服务的其他核心方面。我们当前的架构是从非常非 dotnet 的角度设计的(有趣的是,它主要是由 java 架构师设计的,而不是 .net 架构师……你可以想象这种脱节。)
  • 协议缓冲区看起来很有趣。你提到有一个 C# 生成器。 WSDL 生成器呢?我正在寻找的一件事是能够从 WSDL 开始,并在网络的两侧生成所有内容,DTO 和所有内容。
  • protobuf-net 在每一端都支持不同的类型,只要它们符合合同(例如,我让它在服务器上运行 LINQ-to-SQL 实体,在客户端使用 svcutil 代理实体)一个例子)。 protobuf-net 没有 WSDL,因为不需要第二语言。
  • 我们实际上有 .NET 和 Java 系统,我们还需要与属于我们母公司的其他系统进行互操作,但可能使用多种语言和平台编写。我不确定 protobuf 是否始终是电线两端的可行选择...它的合同语言看起来很简单,我可以从中编写 WSDL/XSD 生成器...但是自定义 protobuf 序列化也是一个要求?
  • 好吧;不。您可以剥离 protobuf-net 位并仅使用 DSL 生成 WCF 代理(很容易做到 - 它只是一个 xslt),但这缺少协议缓冲区的重点......鉴于它在 Java 上受支持, C++、Python 和(分别)所有这些:code.google.com/p/protobuf/wiki/ThirdPartyAddOns - 但 RPC 堆栈(通过 WCF)没有标准化;这是特定于实现的。
【解决方案3】:

我确实更喜欢合同优先的开发。为此,我使用了Service Factory。它让我无需自定义即可生成服务和客户端代码。

通过自定义,我们还能够生成与实体框架对象对应的数据传输对象,以及从一个对象转换到另一个对象的代码;自动记录异常;和服务的 HTML 文档。

这是对服务工厂附带的代码分析规则的补充,它有助于防止开发人员通过选择不兼容的 WCF 选项而自取其辱。

【讨论】:

  • 我有点搞砸了 Service Factory……当你构建它时,它会产生大量的垃圾。视觉合同设计师有点整洁,但我认为整个指导包总体上并不是很有效。如果合同设计师的重量更轻,例如,类似于实体框架设计师或其他东西,那就太好了。有没有类似的东西不那么沉重和侵入性?
  • 我很想知道您所说的“沉重和侵入性”和“大量垃圾”是什么意思。我广泛使用它,并对其进行了大量定制,我不记得它产生了任何可以被视为“垃圾”的东西。我这样说是作为需要进入代码生成逻辑并了解其工作原理的人。
  • 好吧,我没有对代码生成进行任何自定义。我和视觉合同设计师混了一堆,最后告诉它生成代码。它最终创建了几个嵌套的解决方案文件夹,以及近十几个项目,几个测试项目,这些对我来说都不是很有用。我们有一个非常大的现有基础设施,我希望得到一些简单的输出:服务接口、服务实现、数据/消息类型。我没想到会得到十几个项目。
  • 好的,是的,它确实产生了自己的解决方案结构,这是我必须定制的事情之一。我实际上完成了 more 个项目,但都在正确的地方。如果您查看这些项目,您会发现它们确实生成了正确的代码。它与您自己生成的内容几乎没有区别,只是分解为多个项目。
  • 我们不能让它生成项目......我们已经有了项目,我们只需要将生成的代码放入其中。是否有可能通过服务工厂实现这一目标?如果可能的话,我想避免对指导包进行大量定制。而且,理想情况下,最好只生成使用现有 DTO 的服务合同和实现。
【解决方案4】:

在 WCF 中,“合同优先”的表现形式存在一些差异。您可以执行“代码合同优先”,其中您的数据和服务合同表示为具有正确属性标记的 .NET 类型。您可以从 WSDL 开始并生成服务和数据契约,或者您可以从数据契约的 XML 模式开始,并将服务契约表示为代码。你走哪条路真的取决于合同的性质以及如何使用它。

如果您要根据 WSDL 规范实现某些东西,那么从 WSDL 生成代码是显而易见的选择,而手动生成并不是什么大问题。如果您希望对 WSDL 文件的更改立即传播,您可以从项目构建事件触发生成(或进入 msbuild)。

如果您有想要用作数据协定的现有架构 (XSD),或者希望以这种方式开发您的数据协定以便在其他平台上更轻松地重用,您可以使用 xsd.exe 从架构生成类型 (或第 3 方替代方案)。在这种情况下,您将在面向代码的服务合同中使用 XML 可序列化类型,例如 this: 。

如果您自己在 .NET 中开发客户端和服务器,并且您的客户端可以获取您的合约程序集,或者乐于从服务元数据(例如 WSDL)生成客户端,那么在代码中为您的合约建模是一种很棒的体验。使用“已知类型”方案,您可以在数据合约中支持继承模型,这可能非常强大。您可以通过直接引用客户端中的合约程序集来完全跳过生成客户端代码(如其他回复中所述)。它非常高效且优雅,但您需要注意,如果您过于花哨,可能会带来互操作挑战。

【讨论】:

    【解决方案5】:

    此视频中描述了我们这样做的方式:

    http://www.dnrtv.com/default.aspx?showNum=103

    我们的想法是我们不使用代码生成,因此我们避免在合约更改时需要重新生成代码。

    合同在代码中并且可以更改,如果客户端和服务器之间存在不匹配,它将显示在构建错误中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多