7

我正在尝试创建一个具有只读 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 字段的值而不公开我的属性?

4

3 回答 3

9

你可以这样做:

public int Id
{
     get;
     private set;
}

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

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

于 2010-09-29T14:35:53.210 回答
7

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

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

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

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

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

于 2010-09-29T14:33:00.577 回答
1

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

于 2010-09-29T14:09:54.950 回答