WCF:如何在没有设置的情况下公开只读DataMembers属性?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

我有一个服务器端类,通过[DataContract]在客户端提供。这个类有一个只读字段,我想通过一个属性提供。但是,我无法这样做,因为它似乎没有被允许添加[DataMember]属性而没有获取和设置。

所以 - 是否有一种方法可以在没有setter的情况下拥有[DataMember]属性?

[DataContract]
class SomeClass
{
    private readonly int _id; 

    public SomeClass() { .. }

    [DataMember]
    public int Id { get { return _id; } }        

    [DataMember]
    public string SomeString { get; set; }
}

或将溶液中使用[数据成员]作为字段- (例如像显示在这里)?也尝试过这样做,但它似乎并不在乎该领域是只读的..?

是唯一的方法来通过黑客这样做只读属性?

[DataMember]
public int Id
{
    get { return _id; }
    private set { /* NOOP */ }
}
提问于
用户回答回答于

真的,你的“服务器端”类不会被“提供给”客户端。

会发生什么:基于数据契约,客户端将根据服务的XML模式创建一个新的单独的类。它本身不能使用服务器端类!

它将从XML模式定义中重新创建一个新类,但该模式不包含任何.NET特定的东西,比如可见性或访问修饰符 - 毕竟它只是一个XML模式。客户端类将以这种方式创建,使其在线上具有相同的“足迹” - 例如,它基本上序列化为相同的XML格式。

不能 “运输” .NET专有知识有关的类通过标准的基于SOAP的服务-毕竟,所有你身边掠过的序列化的消息 -不上课!

检查“SOA的四条原则”(由微软的Don Box定义):

  1. 边界是明确的
  2. 服务是自治的
  3. 服务共享模式和合同,而不是课程
  4. 可比性基于政策

请参阅第3点 - 服务共享架构和合同,而不是类 - 您只能共享数据协定的接口和XML模式 - 这些都没有 - .NET类。

用户回答回答于

将DataMember属性放在不属于该属性的字段上。

请记住,WCF不知道封装。封装是OOP术语,而不是SOA术语。

也就是说,请记住,对于使用你的课程的人来说,该字段是只读的 - 任何使用该服务的人都可以完全访问他们的字段。

扫码关注云+社区