我遇到了与this thread中指定的问题类似的WCF RIA服务的一些困难。
我正在创建的域服务方法(Query方法)应该采用复杂的对象参数。 示例域服务方法:
public ComplexObjectResult GetComplexObject(ComplexObjectParameter test)
{
//do stuff
}
参数对象:
public class ComplexObjectParameter
{
[Key]
public decimal ID { get; set; }
... other fields
}
我收到此编译错误:错误70域操作条目'GetComplexObject'的参数'test'必须是预定义的可序列化类型之一。
在网上搜索后,我找到了this msdn thread。它声明这是RIA服务的限制,并且该线程没有指定合适的解决方法。
现在似乎有一些肮脏的解决方法:
将复杂参数更改为类型字符串并序列化/反序列化我自己的参数对象,我发现这是一个非常糟糕的解决方案。
在域服务方法上使用[Invoke]标签,并放弃所有RIA跟踪功能,我首先使用RIA。
上述解决方案是否有替代方案,缺点较少?是否有人为此问题找到了更优雅的解决方法?
由于
答案 0 :(得分:6)
脏的解决方法三,是使用[Invoke]属性并向域服务添加一个方法来公开“复杂类型”,它通知WCF RIA工具在客户端创建实体:
public ComplexObjectParameter ExposeComplexObjectParameter()
{
throw new NotSupportedException();
}
我在我的域服务方法中放置了NotSupportedException,以防止在远程调用该方法时出现静默失败。
我不确定此解决方案如何影响丢失“所有RIA跟踪功能”的问题。它没有回答如何使用复杂类型作为参数创建可组合查询。
它很脏,但是抽象出最接近问题根源的问题。呼叫和接收代码更清晰。这样可以保持较高水平的“优雅”,同时推动脏污。
答案 1 :(得分:2)
超级老问题,我知道。但我对此感到满意,并找到答案。来自ComplexObject上的MSDN文档:
但是ComplexObject在重要方面与实体不同。特别是,复杂类型没有身份。这意味着它们没有标记KeyAttribute的成员,因此客户端不能像对实体那样对它们进行身份缓存。无法从多个父实例共享或引用复杂类型,并且它们不支持继承。