Что делать, если имя свойства соответствует имени класса

В нашем коде С# у нас есть класс под названием Project. Наш базовый класс BusinessObject (который наследует все бизнес-объекты) определяет свойство:

public Project Project { get; set; }

Обычно это не проблема, если мы остаемся внутри С# -кода. Однако эти классы бизнес-объектов отображаются в веб-службах через провод. Некоторые языки потребления (например, ActionScript ActionScript) не могут обрабатывать свойство с тем же именем, что и его класс.

Этот конфликт имен происходит повсюду в нашем коде. Иногда легко изменить имя свойства или класса. Иногда это очень сложно. Мы разрушили наши мозги и не смогли найти хороший стандартный способ справиться с этим. Можно переименовать класс Project в ProjectType или ProjectInfo, но это уродливо и нарушает весь существующий код наших потребителей. Мы могли бы оставить имя типа одинаковым и изменить имя свойства в ProjectInfo, но это вызывает ту же проблему.

Есть ли у кого-нибудь рекомендации или рекомендации для такой ситуации?

EDIT:

Отвечая на некоторые из приведенных предложений:

  • Методы не распространяются на провод, поэтому мы не можем использовать методы.
  • Я бы предпочел стандартное соглашение об именах, которое также придерживается стандартных стандартов именования Microsoft.
  • Предоставление другого контракта для Flex может быть опцией. Тем не менее, мы используем Weborb for Flex interop. Weborb использует отражение, чтобы точно соответствовать именам свойств, а не использовать сериализацию XML или SOAP. Если кто-то знает больше о пользовательской сериализации с помощью Weborb, это будет полезно.

ИЗМЕНИТЬ № 2:

Для справки мы закончили переименование свойства на что-то вроде:

public Project ProjectInfo { get; set; }

Ответы

Ответ 1

Похоже, что у вас есть неразрешимая проблема, если у вас уже есть веб-сервис с проблематичным именем. Если вы не можете изменить что-либо, не нарушая существующих клиентов, и вы не можете оставить его таким, как он есть, не нарушая Flex, кто-то сломается.

Вы можете потенциально открыть параллельный API с другим URL-адресом. Я согласен с предложением shahkalpesh методов Get/Set, где свойства будут проблематичными. Хорошо, что вы можете принять решение один раз, а затем быть последовательным, а не думать об этом каждый раз. Это также означает, что вы, вероятно, можете автоматизировать создание второго API на основе первого.

Ответ 2

Я думаю, что лучшим решением является рефакторинг вашего проекта, чтобы переименовать объект Project в нечто другое WnProject, ProjectBase или что-то еще, относящееся к тому, что именно является проектом.

Это ваш API, любой, кто его потребляет, должен понимать, что он может иметь нарушения в изменении, отгрузил его из-за зависимости от внешних источников.

Ответ 3

Я использую camelCase вместо UpperCase для имени членов (методов и свойств).

Однако это противоречит стандартным соглашениям об именах, поэтому я не могу назвать это "лучшей практикой" (но это мне нравится).

Итак, в вашем примере я бы определил:

Project project { get; set; }

Ответ 4

Как насчет добрых старых методов? (GetProject/SetProject или путь .net делает это - Thread.CurrentThread)

Ответ 5

Я знаю, что это старый вопрос, но он может помочь другим.

Почему бы не предоставить другой WSDL для потребителей, которые не поддерживают одно и то же имя и тип?
Переименуйте complextype в WSDL (НЕ имя элемента!)

От чего вы должны (сейчас):

<xs:element name="Project" type="Project"/>

<xs:complexType name="Project">
  <xs:sequence>
    <xs:element name="Title" type="xs:string"/>
    <xs:element name="Description" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

To:

<xs:element name="Project" type="ProjectType"/>

<xs:complexType name="ProjectType">
  <xs:sequence>
    <xs:element name="Title" type="xs:string"/>
    <xs:element name="Description" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

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

Ответ 6

Несмотря на то, что это не очень помогает для внешних языков, возможно псевдоним пространства имен (презумпция класса Project находится в пространстве имен для класса с свойством Project), например:

using ns = MyProject.Namespace;

Тогда вам просто нужно сделать:

var newProject = new ns.Project();

Ответ 7

WTF имеет имя переменной на одном языке, связанную с веб-службой?

Кто-то должен быть на самом деле ленив в привязке XML для деталей реализации, которые должны быть выставлены на провод.

Весь смысл WSDL/SOA заключается в том, что у вас есть спецификация для сообщения, которое не зависит от реализации. Если вы генерируете спецификации сообщений из исходного кода или генерируете источник из спецификаций, не допуская изменения генерируемых объектов, вы оказываетесь в плотно соединенных системах. Одним из симптомов этой жесткой связи является получение имен переменных/свойств, которые не являются юридическими идентификаторами. Служба (а не RPC) не тесно связана. Вам не нужно изменять свою реализацию службы, чтобы обслуживать реализацию службы - если вам нужно, что-то в вашем стеке сломано. Это относится к переменным-членам/свойствам, а также к методам.