2010-08-19 1 views
12

У меня возникли некоторые трудности с услугами WCF RIA, аналогичными задаче, указанной в this thread.Ria Services Передача сложного объекта в качестве параметра метода службы домена запроса

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

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

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

public class ComplexObjectParameter 
{   

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

    ... other fields 
} 

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

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

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

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

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

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

Благодаря

+0

Я пошел со вторым вариантом Стефана. Возвращаемые мною сложные типы были только на клиенте, так что потеря функции отслеживания не была для меня проблемой. Подумайте о том, чтобы в следующий раз включить потенциальные решения (даже грязные) в ответы ... Тогда я бы проголосовал за вопрос и ответ! –

ответ

6

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

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

Я поставил NotSupportedException в моих методах обслуживания домена для предотвращения бесшумные сбоев, если этот метод когда-либо называется дистанционно.

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

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

+1

Привет, Ed, я уже создал поддельный метод Query, чтобы иметь объект complexparameter, сгенерированный на стороне клиента.Это часть грязного решения 2. Но в итоге я использовал еще одно решение: сохраняя параметр комплексного объекта в базе данных, а затем просто передавая идентификатор при запросе. Это решение может быть неприменимо ко всем людям, испытывающим эту проблему, но это подходит моему делу. Спасибо за ваши усилия. – Stephane

+0

Один голос за то, что вам нужно «разоблачить» сложный тип. –

2

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

But a ComplexObject differs from an Entity in important ways. In particular, complex types do not have identities. This means that they do not have members marked with the KeyAttribute and so clients cannot do identity caching for them as it does for entities. Complex types cannot be shared or referenced from multiple parent instances and they do not support inheritance.