我是否认为如果我有一个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
};
}
答案 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;
}
试一试!
希望这会有所帮助:)