Запретить svcutil генерировать атрибуты "EmitDefaultValue = false" - PullRequest
2 голосов
/ 22 июля 2011

Недавно я пытался сгенерировать контракты данных из файлов xsd, используя svcutil так:

svcutil.exe /t:code /dconly /out:MyContract.cs /n:*,My.Namespace MyDataDefinition.xsd

XSD в основном состоит из таких определений:

<xsd:complexType name="SomeComplexObjectType">
    <xsd:sequence>
        <xsd:element name="FirstData" type="xsd:string" minOccurs="0" />
        <xsd:element name="SecondData" type="xsd:string" minOccurs="0" />
    </xsd:sequence>
</xsd:complexType>

svcutil генерирует что-то вроде этого:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="SomeComplexObjectType")]
public partial class PersonInfo : object, System.Runtime.Serialization.IExtensibleDataObject
{
    private string FirstDataField;
    private string SecondDataField;

    [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false)]
    public string FirstData
    {
        get
        {
            return this.FirstDataField;
        }
        set
        {
            this.FirstDataField= value;
        }
    }

    [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false)]
    public string SecondData
    {
        get
        {
            return this.SecondDataField;
        }
        set
        {
            this.SecondDataField= value;
        }
    }
}

Что работает нормально, однако, атрибуты "EmitDefaultValue = false" не нужны. Не говоря уже о том, что он вносит много шума в wsdl, добавляя такие вещи:

<xsd:element minOccurs="0" name="FirstData" nillable="true" type="xsd:string">
    <xsd:annotation>
        <xsd:appinfo>
            <DefaultValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/" EmitDefaultValue="false"/>
        </xsd:appinfo>
    </xsd:annotation>
</xsd:element>

В настоящее время я просто редактирую сгенерированный контракт вручную, но это не идеально с точки зрения обслуживания.

Кто-нибудь знает, как предотвратить автоматическое создание svcutil этих атрибутов EmitDefaultValue = false?

Ответы [ 2 ]

1 голос
/ 23 июля 2011

Пожалуйста, смотрите эту статью .

При импорте схемы свойство EmitDefaultValue устанавливается автоматически в false, если упомянутая ранее специфичная для WCF аннотация обнаружено. Также установлено значение false для ссылочных типов, которые имеют для свойства nillable установлено значение false, чтобы поддерживать определенную совместимость сценарии, которые обычно возникают при использовании веб-служб ASP.NET

Похоже, ваш единственный выбор - изменить входящую схему, чтобы соответствующие элементы можно было обнулить.

0 голосов
/ 29 ноября 2011

Помните, что SvcUtil - это просто инструмент. Если он не соответствует вашим требованиям, напишите свой собственный инструмент!

Вы можете использовать PowerShell для вызова SvcUtil и редактирования сгенерированного файла с вашими пользовательскими изменениями.

Быстрый пример:

#Call SvcUtil
& svcutil #Whatever options you want go here

#Read the generated code
$thierCode = Get-Content "generatedFile.cs"

#Copy each line, editing as you go:
$myCode = @("//This file was generated using MySvcUtil.ps1")
foreach($line in $thierCode)
{
    $myCode += $line.Replace("EmitDefaultValue=false", "")
}

#Write the edited code back into the .cs file.
$myCode | Set-Content "generatedFile.cs"
...