2009-11-09 90 views
0

寻找WCF服务的一些指导原型。WCF:使用只读成员对复杂对象进行序列化

我有一个WCF服务托管在IIS中,将数据传递给我的客户端。我有一个单独的共享程序集,其中包含我的WCF项目中引用的所有业务对象。

我想在这些业务对象中只有一些属性是只读的,因为我不希望我的客户能够在其客户端代码中更改这些字段。

我读到[DataContract]属性的装饰类强制正确的序列化来维护只读字段,但是当我实现它时,客户端中生成的代理类显示为可写。

是否有任何技巧可以实现这个目标?

谢谢!

/埃里克

回答

1

你可以使用普通的属性,与DataMember属性标记他们,使set访问私有:

 [DataMember] 
     public object IsFoo 
     { 
      get 
      { 
       return _isFoo; 
      } 
      private set { } 
     } 

编辑:此外,要真正防止你的类的用户设置该属性,你可以总是抛出一个InvalidOperation异常。

+0

所以我尝试了这条路线(下面),但是当我进入客户端并使用代理对象工作时,我仍然可以“设置”值。 私人字符串strAdUrlTec; [DataMember] public string AdUrlTec { get { return strAdUrlTec; } private set {} } – Eric 2009-11-09 19:05:11

+0

你是如何设置属性的?并从那里 - 它是在拥有班级?如果它在外面,你应该得到一个编译错误! – 2009-11-09 19:06:31

+0

我不是从拥有的课程设置它。我有一个WCF服务项目,该项目反映了我的业务对象所在的外部程序集(特别是我们正在讨论的那个程序集)。我有一个使用WCF服务的单元测试项目。所以在我的单元测试中,我从WCF服务中取出一个对象,然后更改AdUrlTec属性,它让我。上周我看到了另一个线程,提供了相同的解决方案,所以我认为你是对的,但我想知道为什么我的实现不尊重私有设置者。 :( – Eric 2009-11-09 19:13:28

0

根据我的经验,我发现,WCF序列化,只有很简单对象模型很好地工作。如果您计划通过网络传递业务或域对象,则可能需要考虑在“传输”对象中创建站点。这个对象可以让你控制你的消费者正在接收什么,并且可以映射回你的域对象。