首页 文章

只读字段的WCF DataMember属性?

提问于
浏览
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字段的值而不公开我的属性?

3 回答

  • 8

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

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

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

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

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

  • 7

    你可以这样做:

    public int Id
    {
         get;
         private set;
    }
    

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

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

  • 1

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

相关问题