【问题标题】:WCF DataContract ToString functionWCF DataContract ToString 函数
【发布时间】:2009-07-25 02:43:24
【问题描述】:

您能否覆盖 WCF DataContrat 中的 ToString 函数?现在我有:

[DataContract]
public class Keyword
{
    public int ID { get; set; }
    public string Name { get; set; }

    public override string ToString()
    {
        return Name;
    }
}

但它似乎不起作用。无论如何要让它工作?

【问题讨论】:

  • 您希望在哪里看到这个 ToString 方法的结果?

标签: wcf datacontract


【解决方案1】:

我意识到这是旧的,但我想提供一个答案,因为我刚刚为使用这个想法的同事创建了一个示例应用程序。所有这些工作都可以在消费者/测试客户端完成。

如果您查看消费者/测试客户端上的代码,更具体地说,查看作为服务引用的一部分生成的类,您将看到您感兴趣的 [DataContract] 类型。为了做到这一点您应该确保选择了“显示所有文件”。深入到“Reference.cs”类。 这是 Reference.cs 中我的测试类的顶部:

namespace WebApplication1.UCCTestSvcRef {
    using System.Runtime.Serialization;
    using System;


    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name="UCCRecord", Namespace="http://schemas.datacontract.org/2004/07/UCCTest")]
    [System.SerializableAttribute()]
    public partial class UCCRecord : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {

您需要使用的重要位是namespacepartial class。要使用这些,您只需在相同类型的测试客户端中创建一个新类,在相同的命名空间中,并覆盖 ToString() 方法。 以下是如何从消费者/测试客户端上新创建的 UCCRecord.cs 文件中执行此操作的示例。

namespace WebApplication1.UCCTestSvcRef
{
    public partial class UCCRecord
    {
        public override string ToString()
        {
            return "Key: " + Key.ToString() + ", Time: " + Timestamp.ToString("d") + ", Value: " + Value;
        }
    }
}

请注意,我只能引用 KeyTimestampValue,因为它们是 [DataContract] 的 [DataMember] 值。

如果您知道自己在寻找什么,这相对简单。如果这里有什么不清楚的地方,请告诉我,我会尽力澄清。

谢谢

【讨论】:

  • 其实这就是原问题的答案。谢谢!
【解决方案2】:

您希望能够在哪里调用ToString()?方法不是 DataContract 的一部分,因此在您为客户端创建代理时它们将不可用。

当然,没有什么能阻止您自己在客户端代理中编写该方法。

【讨论】:

  • 在客户端的代理中你会怎么做?
  • 您必须有权访问客户端的代理并手动将方法编码到类中。请记住,数据合约就是这样 - 合约 - 它并非旨在具有任何行为,因为行为应该在操作合约中。话虽如此,没有什么能阻止您在服务和客户端中添加您希望的任何方法。
【解决方案3】:

还请记住,如果您同时拥有服务器和客户端,那么您通常可以将共享库用于数据合约,而不是生成客户端代理。如果这样做,那么您可以在服务器和客户端上使用相同的方法,因为它们是完全相同的类型。

【讨论】:

  • 是的,这是应该避免的,作为一般规则,因为它将客户端与服务器紧密绑定;甚至到服务器软件的版本
  • @John 并非如此。这不是二进制依赖项(如 .NET 远程处理具有)。我为我的 WCF 客户端-服务器应用程序执行此操作,并且可以在一侧推出不同的程序集版本而不推出另一侧。唯一需要注意的问题是确保数据合约匹配(合约名称、命名空间、成员名称),这是共享二进制文件或生成的代理的共同问题。
  • 还有一件事——如果你的数据合约实现了IExtensibleDataObject,你甚至可以拥有编译时不包含的旧版本的往返数据成员!因此,如果我在我的数据合同中添加一个新字段“Foo”,将其发送到某个应用程序的旧版本,然后再将其发回,则“Foo”的原始值仍将填充到响应中,即使旧应用程序从来没有新的财产存在。
  • 你说得对,它与 Remoting 的版本依赖不同。尽管如此,它仍然是一个依赖项。客户端使用的程序集版本需要与服务使用的版本兼容。 ToString 没什么大不了的,但如果服务器对客户端的工作方式做出假设,反之亦然。
  • 即使使用代理,客户端代理的版本也必须与服务兼容。没有办法解决这个问题。如果您的数据合约主要表现为 DTO(数据传输对象),那么除了 ToString 或其他任何逻辑之外,不太可能存在任何逻辑。我更喜欢将大多数 DTO 放在共享库中,因为幸运的是 WCF 不会创建二进制耦合。与所有事情一样,这取决于您的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 2013-08-31
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 2016-02-18
  • 1970-01-01
相关资源
最近更新 更多