【问题标题】:WCF method that updates object passed in更新传入的对象的 WCF 方法
【发布时间】:2010-03-31 14:41:28
【问题描述】:

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

例如给定一个数据合约:

[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
  };           
}

【问题讨论】:

    标签: wcf


    【解决方案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;         
    }
    

    试一试!

    希望这会有所帮助:)

    【讨论】:

    • 有趣。我不知道这是可能的。我认为这不是最佳实践吗?
    • 老实说,不确定“最佳实践”,因此不确定“IMO”。我发现从“生产者”(我!)和“消费者”(其他人,有时是我!)以及各方(尤其是消费者!)期望的角度编写代码很有帮助.然而,无论站在哪里实践,ref 明确指出参数可以通过方法进行修改,并且与 WCF 相关,内容应该被传输回来。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-10
      • 2017-05-25
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多