3

并感谢您的阅读。

我正在实现基于预定义规范 (HR-XML 3.0) 的 WCF 服务。因此,我从模式开始,然后回到代码中。本规范提供了许多与我的实现相关的大型 Schema 文档(导入更多的 Schema 文档)。

通过提供“主”和“支持”xsd 文件作为参数,我能够使用 xsd.exe 生成代码。但是有几个问题,我想知道这是否是正确的方法。

  • 几乎有数百个类 - 代码文件大小为半兆
  • 重复的类(例如 Type、Type1 - 它们都代表相同的类型)
  • 有声明为从基类继承的类,但未生成/定义该基类

我了解在针对 DataContractSerializer 甚至 XmlSerializer 时,svcutil.exe/xsd.exe 支持的 Schema 类型存在限制。我的问题有两个:

  1. 在处理较大的模块化 xsd 文件时,代码生成“问题”是否相当普遍?有没有人成功地从 OAGIS 或 HR-XML 模式生成数据合同?
  2. 鉴于上述问题,是否有更好的方法来完成这项任务,避免生成代码和使用具体对象?直接读取和编写 SOAP 消息是否更好,同时仍然利用 WCF 框架的其余部分?我知道我正在失去使用 .NET 对象的便利性以及框架提供的(反)序列化;考虑到这些损失,将我的服务基于 WCF 是否仍然有利?在使用 .NET 类型和纯 XML 之间是否存在一些“中间立场”?

非常感谢!

-Sasha Borodin DFWHC.org

4

2 回答 2

2

Sasha,如果你打算使用代码生成,你可能永远不应该从模块化模式开始。当您针对模块化模式使用代码生成器时,您将为 HR-XML 库中的所有公共组件和 OAGIS 中的一些公共组件生成一个类。你不想要这个。HR-XML 与独立模式一起分发,这是一个更好的起点。一个更好的起点是创建一个扁平化的包 xsd,它只包含 WSDL 引入的类型。如果您使用几个独立的模式,您将至少在生成的代码中有一些重复。

于 2010-03-17T14:20:09.570 回答
1

好吧,你可以尝试做这样的事情:

  • xsd.exe使用类似Microsoft 的工具或类似Xsd2Code作为 Visual Studio 插件的工具,将您的 XSD 分别转换为 C# 代码。

Visual Studio 中的 Xsd2Code http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=Xsd2Code&DownloadId=41336

  • 一旦你有了你的 C# 类,清除任何不一致、重复等等
  • 将所有内容打包到一个单独的类库程序集中

  • 现在,当使用Add Service ReferenceVisual Studio 或svcutil.exe工具从 WSDL 生成 WCF 服务时,请使用所有数据类引用该程序集。这样做,WCF 应该跳过重新创建整个类集,并使用该数据程序集中可用的任何内容

有了这个,你也许可以控制这个混乱。

于 2010-03-16T21:29:28.303 回答