Генерация атрибутов FaultContract из записей .proto rpc - PullRequest
2 голосов
/ 13 сентября 2010

Я использую protobuf-net в проекте, над которым я работаю, для контрактов на данные, создавая файлы .proto вручную и используя пользовательский инструмент для написания кода C #, который он должным образом выполняет. Я также начал использовать это для сервисных контрактов, и сервисные интерфейсы также созданы просто отлично.

Для подключения к некоторым системам я использую WCF, поэтому я включил опцию генератора datacontracts и, хотя атрибуты System.ServiceModel присутствуют, у меня нет никакого способа объявить конкретные ошибки сервис может поднять.

Итак, моя проблема в основном:

  • Язык протокольных буферов не имеет каких-либо конструкций для исключений / ошибок.
  • Я не вижу никаких параметров protobuf-net для генерации атрибутов FaultContract.
  • Интерфейс, сгенерированный protobuf-net, не объявлен частичным, поэтому я не могу дополнить сгенерированный код.

Есть ли какой-нибудь способ объявить ошибки работы службы WCF в protobuf-net, или это то, что мне придется ждать версии 2?

Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 14 сентября 2010

Я не уверен, почему я не объявляю это как partial interface, так как это кажется совершенно счастливым в C # 2.0; Я получу это изменение, когда получу секунду, но учтите, что вы можете применить ручное изменение локально - просто отредактировав файл csharp.xslt. Теперь xslt - это не чашка чая для всех, но это должно быть изменение в 1 строку (рядом со словом interface) - фактически, это, вероятно, добавление partial здесь:

<xsl:template match="ServiceDescriptorProto">
    <xsl:if test="($optionClientProxy or $optionDataContract)">
    [global::System.ServiceModel.ServiceContract(Name = @"<xsl:value-of select="name"/>")]</xsl:if>
    public /* HERE => */ partial /* <= HERE */ interface I<xsl:value-of select="name"/>
    {
      <xsl:apply-templates select="method"/>
    }

    <xsl:if test="$optionProtoRpc">
    public class <xsl:value-of select="name"/>Client : global::ProtoBuf.ServiceModel.RpcClient
    {
      public <xsl:value-of select="name"/>Client() : base(typeof(I<xsl:value-of select="name"/>)) { }
      <xsl:apply-templates select="method/MethodDescriptorProto" mode="protoRpc"/>
    }
    </xsl:if>
    <xsl:apply-templates select="." mode="clientProxy"/>

</xsl:template>

Поскольку xslt настраивается, вы сможете применить любые другие необходимые изменения.

0 голосов
/ 13 сентября 2010

это не дает прямого ответа на ваш вопрос, но может быть уместным в любом случае
Protobuf-net не нуждается в файлах .proto для работы, поэтому было бы одинаково сложно просто написать свои классы C # и украсить их атрибутами WCF (и вашими атрибутами FaultContract), чем создать прототип (вручную) для ради генерации классов C #.

...