引用公共类型的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.exe
用于多个文件参数:
xsd .'XSD'Common.xsd .'XSD'Employee.xsd .'XSD'Company.xsd /c /o:. /n:"DomainModel"
您基本上希望将公共类型拆分为一个公共程序集,该程序集是其他类型的引用。您有两个选项:
- 手动拆分它们。我知道这是一个生成文件,但如果你的源模式是相当静态的,那么这是一个一次性的练习。
- 使用svcutil.exe代替。然而,这要复杂得多,实际上您甚至可能无法做到这一点,除非您的模式都遵守某些指导原则。如果您感兴趣,请参阅下面的流程。
如果你喜欢上面的选项2,那么一般的过程如下:
- 从Common中提取类型。XSD在svcutil上使用/donly标志。这将生成一个带有常用类型的类文件。
- 将该类编译为程序集
- 使用/r标志从A.xsd中提取类型,并引用CommonTypes.dll程序集。
- 对B.xsd 执行相同操作
然而,这种方法是基于svcutil使用DataContractSerializer来完成这项工作,因为/r标志对XmlSerializer不可用。只有当模式遵循相当严格的DCS规则(可以在这里找到:http://msdn.microsoft.com/en-us/library/ms733112.aspx)时,这才会起作用。
如果不遵守这些规则,那么svcutil将退回到使用不支持/r标志的XmlSerializer。