大型/复杂模式(HR-XML / OAGIS)的WCF代码生成 - 还有其他选择吗?

时间:2010-03-16 20:12:26

标签: wcf code-generation xsd.exe

感谢您阅读。

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

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

  • 有数百个类 - 代码文件大小为半个大小
  • 重复的类(例如Type,Type1 - 两者都代表相同的类型)
  • 有一些类被声明为从基类继承,但是没有生成/定义该基类

据我所知,在定位DataContractSerializer甚至是XmlSerializer时,svcutil.exe / xsd.exe支持的架构类型存在限制。我的问题有两方面:

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

    -Sasha Borodin DFWHC.org

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

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

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

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

有了这个,你可能能够控制住这个烂摊子。