12

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

我的问题如下:

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

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

编辑:

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

4

5 回答 5

15

WSCF提供了一个带有 VS 集成的契约优先工具。看看这个。(自由)

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

于 2009-07-02T11:57:05.880 回答
5

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

实际上,要使用 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 的“协议缓冲区”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 集成;我正在努力解决这个问题(证明)。

于 2009-07-02T11:33:37.473 回答
3

我确实更喜欢合同优先的开发。为此,我使用了服务工厂。它允许我在没有自定义的情况下生成服务和客户端代码。

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

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

于 2009-06-26T03:36:14.193 回答
2

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

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

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

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

于 2009-12-02T04:42:27.690 回答
0

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

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

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

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

于 2009-07-05T20:39:08.923 回答