2012-05-13 2 views
1

Теперь вы достигли 74-й очереди WCF Hell, в которой я обречен на вечную путаницу DTO. Я хорошо привык к рассудительно инкапсулированный объект/механизм свойств устанавливающих, как это, где значение некоторые по умолчанию устанавливается в конструкторе, а сброс этого значения «пачкает» объект:Используя DTO, каков правильный способ обновить свойство BLL в WCF?

public class SomeObject 
{ 
    private int someValue; 

    public int SomeValue 
    { 
     get { return someValue; } 
     set 
     { 
      someValue = value; 
      // now SomeObject.IsDirty = true; 
     } 
    } 

    public SomeObject(int someDefaultValue) 
    { 
     someValue = someDefaultValue; 
    } 
} 

DTOS появляются решительно против к этой простой конструкции я предполагаю (но не знаю) через декораторы DataContract и DataMember. Когда я пошагово, я вижу некоторые вызовы в стеке, я не могу ворваться, но это примерно результат:

[DataContract] 
public class SomeObjectDTO 
{ 
    private int someValue; 

    [DataMember] 
    public int SomeValue 
    { 
     get { return someValue; } 
     set 
     { 
      // apparently the set is getting called by the constructor? 
      someValue = value; 
     } 
    } 

    public SomeObjectDTO(int someDefaultValue) 
    { 
     //apparently no one cares what I want to do here? next line won't fire 
     someValue = someDefaultValue; 
    } 
} 

я могу увидеть значение потока параметра конструктора в set, но дон «Не знаю, как это сделать, и я не вижу, как отделить значение, построенное по умолчанию для сопоставления по умолчанию, из EDIT, отредактированного пользователем-edit-property-value-and-it-must-be-return-to-the-service.

Я уверен, что это злоупотребление DTOS, но я не могу видеть правильный путь WCF, чтобы справиться с этим очень основными, общими случаями:

  • Как вы разделяете экземпляр свойства значение от редактирования ?
  • Если у вас есть объект/DTO с, скажем, 50 свойствами, откуда вы знаете, когда пользователь меняет 49 из них, и как вы отправляете эти изменения обратно на корабль материального объекта BLL за один выстрел?
+0

Являются ли DTO, используемые в вашей OperationContracts? –

+0

Да, это целая цель их создания. – downwitch

ответ

0

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

Если вы перейдете к WCF-операциям, использующим WCF, очень легко понять, что происходит, если вы не внимательно смотрите на свой стек вызовов. Некоторые SomeObjectDTO могут быть правильно построены на стороне сервера, и вы можете подумать, что вызов завершен ... только чтобы увидеть, как он снова прошел. MSFT не может документировать это, я полагаю, но эта «вторая» конструкция, которая игнорирует любой конструктор, который использует параметры, - это фактически десериализация. Для новичков DataContract я не могу подчеркнуть это достаточно: вы построите свой объект в соответствии с некоторыми правилами на стороне обслуживания, тогда он (если вы не внедрили свои собственные сериализаторы), 100% из зрелища сериализуются и десериализуются, что на клиентская сторона приводит к новой, без параметров конструкции, то есть вы не можете ее построить, используя что-либо, кроме set методов. Это потому, что он не «сконструирован», он перестраивается (или, как говорят некоторые, «регидратируется») из строки метаданных о себе. Это не что иное, как атрибуты, натянутые вместе, под родительским элементом.

Sooo на вопрос о некотором IsDirty логике, встроенной в DataMember, забудьте об этом. Объекты - это механизмы транспорта, выбросы, только такие умные, как то, что может быть сериализовано, и это довольно глупо: список пар имя-значение. Единственный способ узнать, когда 1 из 50 свойств изменился или не изменился ... заключается в сравнении значений, между объектами, в какой-то более умной (по крайней мере полу) устойчивой среде: это что это было? Нет, это не так? О, это грязно. Времена 50. Или 1000. Или сколько угодно.

Что такое веселье во всем этом, так это то, что SOA и «развязка», реализованная в WCF, представляют собой гигантский скачок вперед для развития.Они не; они представляют собой очень слабый консенсус, подход с наименьшим общим знаменателем, который при распределении на уровне отдельных приложений требует значительного повторения усилий. В лучшем случае, эта репликация расходуется на устранение неполадок с объединением моделей, действий и протоколов; В худшем случае вы напишете n версии вашего кода для обработки n. Это становится неоновой видимой и, следовательно, тем более болезненной, в реализациях .NET-.NET, которая является сильным аргументом против использования WCF вообще, если .NET - это ваша платформа, а MSFT - ваша среда. Бросьте в один миллион скрытых настроек конфигурации по умолчанию, ожидая, чтобы взорвать операцию с нулевым точным сообщением об исключении, и вы можете назвать это днем ​​или тремя или четырьмя человеко-месяцами больше, чем вы в настоящее время охвачены.

Смежные вопросы