Подтвердить что ты не робот

Сервисы Ria Передача сложного объекта в качестве параметра метода службы домена запроса

Я испытываю некоторые трудности с услугами WCF RIA, аналогичными проблеме, описанной в этом потоке.

Метод domainervice, который я создаю (метод Query), должен принимать комплексный параметр объекта. Пример метода domainervice:

public ComplexObjectResult GetComplexObject(ComplexObjectParameter test)
   {
        //do stuff
   }

объект параметра:

public class ComplexObjectParameter 
{        

    [Key]
    public decimal ID { get; set; }

    ... other fields
}

Я получаю эту ошибку компиляции: Ошибка 70 Параметр "test" записи операции домена "GetComplexObject" должен быть одним из предопределенных сериализуемых типов.

После некоторого поиска в Интернете я нашел этот поток msdn. В нем указано, что это ограничение служб RIA, и нить не указывает на приемлемые способы обхода.

Теперь есть некоторые грязные обходные пути:

  • Измените сложный параметр, чтобы набрать строку и сериализовать/десериализовать сам объект параметров, который я нахожу очень хакерским решением.

  • Используйте тег [Invoke] для метода службы домена и потеряйте все функции отслеживания RIA, для которых я использую RIA в первую очередь.

Существуют ли альтернативы для упомянутых решений, которые имеют меньше недостатков? Кто-то нашел более элегантное обходное решение для этой проблемы?

Спасибо

4b9b3361

Ответ 1

Грязное обходное решение три - использовать атрибут [Invoke] и добавить метод к службе домена, чтобы разоблачить "сложный тип", который информирует инструментарий WCF RIA для создания объекта на стороне клиента:

public ComplexObjectParameter ExposeComplexObjectParameter()
{
    throw new NotSupportedException();
}

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

Я не уверен, как это решение влияет на проблему потери "всех функций отслеживания RIA". Он не отвечает, как создать составной запрос с использованием сложного типа в качестве параметра.

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

Ответ 2

Супер старый вопрос, я знаю. Но я только что понял, и нашел ответ. Из документов MSDN на ComplexObject:

Но ComplexObject отличается от Entity важными способами. В частности, сложные типы не имеют тождеств. Это означает, что у них нет членов, отмеченных ключом KeyAttribute, и поэтому клиенты не могут выполнять кеширование имен для них, как это делается для сущностей. Сложные типы нельзя разделить или ссылаться на несколько родительских экземпляров, и они не поддерживают наследование.