更新传入的对象的WCF方法

时间:2010-03-31 14:41:28

标签: wcf

我是否认为如果我有一个WCF,OperationContract接受一个对象并需要在该对象上设置属性以便客户端获取更新,我需要声明它以返回该对象。

e.g。给出数据合同:

[DataContract]
public class CompositeType
{
    [DataMember]
    public int Key { get; set; }

    [DataMember]
    public string Something { get; set; }
}

这不适用于WCF:

public void GetDataUsingDataContract(CompositeType composite)
{
  composite.Key = 42;              
}

这将有效:

public CompositeType GetDataUsingDataContract(CompositeType composite)
{
  composite.Key = 42;

  return new CompositeType
  {
    Key = composite.Key,
    Something = composite.Something
  };           
}

2 个答案:

答案 0 :(得分:1)

如果你使用'开箱即用'WCF,你实际上使用的是一种web服务,它使用从客户端发送到服务器的对象的序列化版本。 这就是您无法“通过引用”更改对象的属性的原因。您将始终必须使用请求/响应模式。

答案 1 :(得分:1)

IMO,通过副作用产生输出的创作方法是一个“坏”的事情。但话虽如此,是否存在需要这种模式的情况?是。

当然C#编程模型允许这样,WCF坏了吗?在某个时刻,人们必须意识到他们正在消耗WCF,并且作为一个框架,它试图满足大多数用例[例如,在所有往返行程中复制所有输入参数以保留隐含的副作用语义总之,是愚蠢的。

当然,有很多方法可以解决这个问题 - C#还提供了这些场景的明确声明,WCF也支持这些场景!

例如

// use of "ref" indicates argument should be returned to 
// caller, black-eye and all!
public void GetDataUsingDataContract (ref CompositeType composite) 
{
    composite.Key = 42;         
}

试一试!

希望这会有所帮助:)