【问题标题】:Ria Services Passing Complex Object as parameter to a query domain service methodRia Services 将复杂对象作为参数传递给查询域服务方法
【发布时间】:2010-08-19 14:47:54
【问题描述】:

我在使用 WCF RIA 服务时遇到了一些问题,类似于this thread 中指定的问题。

我正在创建的域服务方法(查询方法)应该采用复杂的对象参数。 域服务方法示例:

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

参数对象:

public class ComplexObjectParameter 
{        

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

    ... other fields
}

我收到此编译错误:域操作条目“GetComplexObject”的错误 70 参数“test”必须是预定义的可序列化类型之一

在网上搜索后,我找到了this msdn thread。它指出这是 RIA 服务的限制,并且该线程没有指定合适的解决方法。

现在似乎有一些肮脏的解决方法:

  • 将复杂参数更改为类型字符串并自行序列化/反序列化参数对象,我发现这是一个非常hacky的解决方案。

  • 在域服务方法上使用 [Invoke] 标记并放弃所有 RIA 跟踪功能,为此我首先使用 RIA。

上述解决方案有没有缺点较少的替代方案?有人找到解决此问题的更优雅的解决方法了吗?

谢谢

【问题讨论】:

  • 我选择了你的第二个选项 Stephane。我返回的复杂类型在客户端上是只读的,因此丢失跟踪功能对我来说不是问题。下次考虑将潜在的解决方案(甚至是肮脏的解决方案)放入答案中......我会投票给问题和答案!

标签: c# silverlight wcf .net-4.0 wcf-ria-services


【解决方案1】:

肮脏的解决方法三,是使用 [Invoke] 属性并向域服务添加一个方法以公开“复杂类型”,从而通知 WCF RIA 工具在客户端创建实体:

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

我将 NotSupportedException 放在我的域服务方法中,以防止在远程调用该方法时出现静默失败。

我不确定此解决方案如何影响丢失“所有 RIA 跟踪功能”的问题。它没有回答如何使用复杂类型作为参数来创建可组合查询。

它很脏,但抽象出最接近问题根源的问题。调用和接收代码更干净。这在将肮脏向下推的同时将“优雅”保持在更高的水平。

【讨论】:

  • 嗨 Ed,我已经创建了一个假 Query 方法来在客户端生成 complexparameter 对象。它是肮脏解决方案 2 的一部分。但我最终使用了另一种解决方案:持久化复杂对象参数到数据库,然后在查询时只传递id。此解决方案可能不适用于所有遇到此问题的人,但它适合我的情况。感谢您的努力。
  • 一票解释您需要“公开”复杂类型。
【解决方案2】:

超级老问题,我知道。但我只是对此有所了解,并找到了答案。来自ComplexObject 上的 MSDN 文档:

但是 ComplexObject 在一些重要方面与实体不同。特别是,复杂类型没有身份。这意味着它们没有使用 KeyAttribute 标记的成员,因此客户端不能像对实体那样为它们进行身份缓存。复杂类型不能从多个父实例共享或引用,它们不支持继承。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多