Сервисы 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 в первую очередь.
Существуют ли альтернативы для упомянутых решений, которые имеют меньше недостатков? Кто-то нашел более элегантное обходное решение для этой проблемы?
Спасибо
Ответы
Ответ 1
Грязное обходное решение три - использовать атрибут [Invoke] и добавить метод к службе домена, чтобы разоблачить "сложный тип", который информирует инструментарий WCF RIA для создания объекта на стороне клиента:
public ComplexObjectParameter ExposeComplexObjectParameter()
{
throw new NotSupportedException();
}
Я помещаю NotSupportedException в мои методы службы домена, чтобы предотвратить молчание, если метод когда-либо называется удаленно.
Я не уверен, как это решение влияет на проблему потери "всех функций отслеживания RIA". Он не отвечает, как создать составной запрос с использованием сложного типа в качестве параметра.
Он грязный, но абстрагирует проблему, наиболее близкую к источнику проблемы. Код вызова и получения более чистый. Это поддерживает "элегантность" на более высоком уровне, одновременно отталкивая грязную сторону.
Ответ 2
Супер старый вопрос, я знаю. Но я только что понял, и нашел ответ. Из документов MSDN на ComplexObject:
Но ComplexObject отличается от Entity важными способами. В частности, сложные типы не имеют тождеств. Это означает, что у них нет членов, отмеченных ключом KeyAttribute, и поэтому клиенты не могут выполнять кеширование имен для них, как это делается для сущностей. Сложные типы нельзя разделить или ссылаться на несколько родительских экземпляров, и они не поддерживают наследование.