只读字段的WCF DataMember属性?

时间:2010-09-29 13:51:08

标签: wcf datacontract datamember

我正在尝试使用只读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字段的值而不公开我的属性?

3 个答案:

答案 0 :(得分:8)

你可以这样做:

public int Id
{
     get;
     private set;
}

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

但是,我同意桑德斯的意见,因为你的DTO应该是一个愚蠢的容器。

答案 1 :(得分:7)

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

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

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

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

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

答案 2 :(得分:1)

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