在实际情况中,这个问题更多的是探索人们在社区中所做的事情,而非特定目标问题 . 我已经对此进行了广泛的搜索,虽然我发现许多博客主张提出 Contract 优先服务设计并且有一些评论支持它们,但我还没有找到关于实施与WCF Contract 优先的实用信息,优缺点我在最近对SOA进行了一些广泛的研究,主要是通过Thomas Erl的书籍,他提倡的主要概念之一是 Contract 优先设计 .
我的问题如下:
-
如何使用.NET和WCF实现 Contract 优先服务设计?
-
除了svcutil之外还有其他工具可以从 Contract 生成客户端和服务吗? (任何与VS集成的东西都是理想的)
-
您在合约优先设计和wCF方面遇到过哪些真实的专业人士?
-
您在合约优先设计和WCF方面遇到了什么现实利弊?
Contract 优先发展的主要问题之一似乎是工具 . Svcutil是我发现的唯一可以从 Contract 生成服务代码的东西,它有一些非常差的输出 . 它的单个文件,充满了属性和代码生成工件,它基本上需要在 Contract 更新时重新生成和替换 . 我更喜欢更好的方法,最好是不需要再生更换的方法 . 我甚至可以手动创建服务端 Contract ,假设它在实际场景中是实用的 .
编辑:
虽然WCSF解决了我的迫切需求,但了解Protocol Buffers和Service Factory都是有趣的工具,我相信这些工具将来会帮助我 .
5 回答
WSCF提供了具有VS集成的 Contract 优先工具 . 看看这个 . (自由)
截至7月6日,有一个带安装程序的二进制版本 .
我使用 Contract 优先方法,通常(但不总是)在每一端使用相同的类型表示 .
实际上,要使用WCF,您不需要任何特殊代理等;您可以在两端使用常规.NET类型,而根本不使用
svcutil.exe
. 获得工作服务就像将"ABC"添加到配置文件中一样简单,并使用如下内容:现在你可以使用:
您在客户端(和服务器)拥有的只是您的
IMyService
界面 .对于其他工具; protobuf-net是Google的“协议缓冲”API的实现,它具有用于以“ Contract 优先”(和可移植/可互操作)方式描述数据和服务的DSL - 例如(.proto文件):
protobuf-net工具(我维护)包括一个"protogen"实用程序,用于将此DSL转换为C#/ VB;其中一个选项(对于C#,至少 - 我需要检查VB)是发出一个完整的WCF代理实现(用你选择的同步或异步方法);非常类似于svcutil - 但是(由于protobuf-net关系)它在操作 Contract 中包含自定义
[ProtoBehavior]
属性,因此它使用protobuf-net序列化器而不是DataContractSerializer
(更快,更高效,但不同) .对于VS集成;我正在努力(proof) .
我更喜欢 Contract 优先发展 . 我为此目的使用了Service Factory . 它允许我生成服务和客户端代码而无需自定义 .
通过自定义,我们还能够生成与Entity Framework对象相对应的数据传输对象,以及从一个对象转换为另一个的代码;自动记录异常;和服务的HTML文档 .
这是Service Factory附带的代码分析规则的补充,它有助于防止开发人员通过选择不兼容的WCF选项来自我攻击 .
在WCF中,您在“ Contract 优先”看起来有多种多样性 . 您可以先执行“代码 Contract ”,其中您的数据和服务 Contract 表示为具有正确属性标记的.NET类型 . 您可以从WSDL开始并生成服务和数据协定,或者您可以从数据协定的XML模式开始,并将服务 Contract 表示为代码 . 您走哪条路取决于 Contract 的性质以及 Contract 的使用方式 .
如果您正在为WSDL规范实现某些东西,那么来自WSDL的代码生成是显而易见的选择,并从中生成手并不是什么大不了的事 . 如果希望更改WSDL文件立即传播,则可以从项目构建事件(或进入msbuild)触发生成 .
如果您希望将现有架构(XSD)用作数据协定,或者希望以这种方式开发数据协定以便在其他平台中更容易地重用,则可以使用xsd.exe(或第3版)从架构生成类型派对替代) . 在这种情况下,您将在面向代码的服务 Contract 中使用XML可序列化类型,如this :.
如果您在.NET中自己开发客户端和服务器,并且您的客户可以获得 Contract 程序集或者很高兴从服务元数据(例如WSDL)生成客户端,那么在代码中对 Contract 进行建模是一种很棒的体验 . 使用“已知类型”方案,您可以在数据协定中支持继承模型,这可能非常强大 . 您可以通过直接引用客户端中的 Contract 程序集来完全跳过生成客户端代码(如其他回复中所述) . 它非常高效和优雅,但你需要意识到,如果你太过花哨,你可以创造互操作挑战 .
我们这样做的方式在此视频中描述:
http://www.dnrtv.com/default.aspx?showNum=103
我们的想法是不使用代码生成,因此我们避免在 Contract 更改时需要重新生成代码 .
然后 Contract 是代码并且可以更改,如果客户端和服务器之间不匹配,它将显示在构建错误中 .