引用公共类型的XSD Gen类

本文关键字:XSD Gen 类型 引用 | 更新日期: 2023-09-27 18:16:08

我使用XSD在c#中定义我的DTO类型。我正在使用XSD.exe来生成XSD的类。

我有一个共同点。xsd,它定义了一个地址类型,我想在多个类中使用它:

  <xs:complexType name="Address">
    <xs:sequence>
      <xs:element name="Street1" type="xs:string"/>
      <xs:element name="Street2" type="xs:string"/>
      <xs:element name="City" type="xs:string"/>
      <xs:element name="State" type="xs:string"/>
      <xs:element name="Zip" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="Address" type="mhm:Address"/>

我在公司引用这个XSD:

  <xs:include schemaLocation=".'Common.xsd"/>
  <xs:complexType name="Company">
    <xs:sequence>
      <xs:element name="AdmCode" type="xs:string"/>
      <xs:element name="CompanyCode" type="xs:string"/>
      <xs:element name="Name" type="xs:string"/>
      <xs:element ref="mhm:Address"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="Company" type="mhm:Company"/>

和一个雇员XSD:

  <xs:include schemaLocation=".'Common.xsd"/>
  <xs:complexType name="Employee">
    <xs:sequence>
      <xs:element name="EmployeeNumber" type="xs:int"/>
      <xs:element name="FirstName" type="xs:string"/>
      <xs:element name="LastName" type="xs:string"/>
      <xs:element name="Address" type="mhm:Address"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="Employee" type="mhm:Employee"/>

我使用以下命令行生成类:

xsd .'XSD'Common.xsd /c /o:. /n:"DomainModel"
xsd .'XSD'Employee.xsd /c /o:. /n:"DomainModel"
xsd .'XSD'Company.xsd /c /o:. /n:"DomainModel"

当我去编译项目时,我发现在Company.cs类文件和Employee.cs类文件中都生成了Address类型。

如何在Common.cs类文件中只生成一次地址类型,并且Employee和Company类型使用此单一地址类型?

引用公共类型的XSD Gen类

您可以将XSD.exe用于多个文件参数:

xsd .'XSD'Common.xsd .'XSD'Employee.xsd .'XSD'Company.xsd /c /o:. /n:"DomainModel"

您基本上希望将公共类型拆分为一个公共程序集,该程序集是其他类型的引用。您有两个选项:

  1. 手动拆分它们。我知道这是一个生成文件,但如果你的源模式是相当静态的,那么这是一个一次性的练习。
  2. 使用svcutil.exe代替。然而,这要复杂得多,实际上您甚至可能无法做到这一点,除非您的模式都遵守某些指导原则。如果您感兴趣,请参阅下面的流程。

如果你喜欢上面的选项2,那么一般的过程如下:

  1. 从Common中提取类型。XSD在svcutil上使用/donly标志。这将生成一个带有常用类型的类文件。
  2. 将该类编译为程序集
  3. 使用/r标志从A.xsd中提取类型,并引用CommonTypes.dll程序集。
  4. 对B.xsd
  5. 执行相同操作

然而,这种方法是基于svcutil使用DataContractSerializer来完成这项工作,因为/r标志对XmlSerializer不可用。只有当模式遵循相当严格的DCS规则(可以在这里找到:http://msdn.microsoft.com/en-us/library/ms733112.aspx)时,这才会起作用。

如果不遵守这些规则,那么svcutil将退回到使用不支持/r标志的XmlSerializer。