【问题标题】:WCF DataMember attribute for read-only fields?只读字段的 WCF DataMember 属性?
【发布时间】:2011-04-18 20:17:02
【问题描述】:

我正在尝试创建一个具有只读 Id 字段的类,但是当对象通过 WCF 服务器时,我无法保留该值。

我无法在公共属性上设置[DataMember] 属性,因为没有set 方法,我希望尽可能保持这种状态,因为我不希望通过外部方式更改此值。我无法在私有字段上设置 [DataMember] 属性,因为它在部分信任环境中引发错误。

public class MyClass
{
    private int _id;

    public int Id 
    { 
        get { return _id; } 
    }

    private string _otherProperties;

    [DataMember]
    public string OtherProperties
    {
        get { return _otherProperties; } 
        set { _otherProperties = value; }
    }
}

有没有办法在通过 WCF 服务器时保持 Id 字段的值而不公开我的属性?

【问题讨论】:

标签: wcf datacontract datamember


【解决方案1】:

你可以这样做:

public int Id
{
     get;
     private set;
}

这将使反序列化程序保持愉快,同时不会让人们实际设置 ID 值。您必须在构造函数中设置它,或者在另一个属性的设置器中设置它。

但是,我确实同意 Sanders,因为您的 DTO 应该是一个愚蠢的容器。

【讨论】:

    【解决方案2】:

    一般来说,您的数据合约类应该是非常轻量级的数据传输对象,没有附加任何逻辑或更深层的含义。只是用于在云中传输数据的容器。它们应该是公共类,只有一组公共读写属性。在您的业务逻辑类中,您应该将它们转换为一些内部业务实体,并在传输数据时执行相反的操作。

    这将数据传输模型与任何内部实体模型分开,并确保最佳可维护性,从而避免您面临的问题 - OO 设计问题与 WCF 操作行为冲突。

    对于非常小的项目,保留单独模型的开销可能不值得。 AutoMapper 可以帮助减少所需的体力劳动。

    谈到您的具体情况,我不确定我是否完全理解问题陈述。您不想修改某些字段吗?但是这个字段只是数据模型的一部分——数据模型的一部分永远不会“修改”——没有“旧”数据,只是你的客户组成的数据。您的客户端代码只是向服务器发送一个数据对象。如果服务器不关心类的一个成员,它应该忽略它。

    这不像数据契约对象的实例存在于服务器上并等待客户端操作它们。在这种情况下,只读字段在概念上可能有意义,但对于 WCF,情况并非如此。客户端只是组成一个对象并将其发送到服务器。如果您不希望服务器侦听某些数据,请不要将其添加到数据模型中,或者(如果有时可能需要,仅针对特定用户等)让服务器在不需要时忽略它。

    【讨论】:

    • 让我看看我是否有这个直...包含业务逻辑、INotifyPropertyChanged、功能等的类本身?
    • 是和不是。数据传输对象实际上不需要一对一地映射到任何业务逻辑对象。例如,我可能有一个庞大而复杂的 Employee 业务对象,但在我的各种 WCF 操作中,我只是公开了与特定操作相关的数据。例如。 UpdateContactInfo(Guid employeeID, ContactInfo info) 只会携带联系信息 - 虽然它可能仍然是我的 Employee 业务对象的一部分。不过,对于小型场景,数据传输对象和业务对象往往几乎相同 - 只是没有任何“不受欢迎的”字段(例如密码哈希)。
    【解决方案3】:

    没有。数据成员必须具有可序列化的 getter 和 setter。验证客户端上的 ID 未更改是服务的责任。

    【讨论】:

      猜你喜欢
      • 2010-12-24
      • 2010-10-08
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 2011-01-30
      相关资源
      最近更新 更多