Rac*_*hel 7 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; }
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在通过WCF服务器时保持Id字段的值而不公开我的属性?
你可以这样做:
public int Id
{
get;
private set;
}
Run Code Online (Sandbox Code Playgroud)
这将使反序列化程序保持高兴,同时不让人们实际设置ID值.您必须在构造函数中或在另一个属性的setter中设置它.
但是,我同意桑德斯的观点,因为你的DTO应该是一个愚蠢的容器.
一般来说,你的数据合同类应该是没有连接到他们的任何逻辑或更深的含义非常轻量级的数据传输对象.只是用于在云中传输数据的容器.它们应该是公共类,只有一组公共读写属性.在业务逻辑类中,您应该将它们转换为一些内部业务实体,并在传输数据时执行相反的操作.
这种分离的任何内部实体模型的数据传输模式,并确保最佳的维护,让您避免出现问题,如你所面临的一个 - 在与WCF经营行为OO设计问题的冲突.
对于非常小的项目,保持单独模型的开销可能不值得.AutoMapper可以帮助减少所需的手工劳动.
说到您的具体情况,我不确定我是否完全理解问题陈述.您不希望某些字段被修改?但是,本场仅仅是一个数据模型的组成部分 - 数据模型的部分从来没有"修改" - 没有"旧"的数据,你的客户端发出了刚才的数据.您的客户端代码只是将数据对象发送到服务器.如果服务器不关心该类的一个成员,则应该忽略它.
它不像服务器上存在数据协定对象的实例,而是等待客户端操作它们.在这种情况下,只读字段在概念上可能有意义,但对于WCF则不是这样.客户端只是组成一个对象并将其发送到服务器.如果您不希望服务器收听某些数据,请不要将其添加到数据模型中(或者,如果有时需要,仅针对特定用户等)使服务器在不需要时忽略它.