没有注释的WCF合同

Yan*_*nis 2 c# wcf

我想知道是否有任何方法可以在不使用[DataContract]和[DataMember]注释的情况下定义WCF Contract类.原因是我们目前拥有的域模型相当干净,所以我们希望保持这种方式.什么是最好的做法?创建一个Transfer对象并将域模型对象复制到一个传输对象(具有所需的注释并且是在Client和Server之间传输的契约)?或者以某种方式不注释对象模型并以不同的方式指定契约.

Mic*_*eld 5

如果不向类添加任何序列化属性,并将其用作WCF服务契约方法的一部分,则WCF将使用默认序列化规则来生成数据协定.这意味着该类将隐式地成为[DataContract]每个公共属性,其中 a getsetaccessor都将隐式成为a [DataMember].

需要应用属性的唯一时间是您是否要覆盖默认行为,例如隐藏某些属性,应用命名空间等.无论如何,这通常被视为良好做法,因为依赖默认行为可能会让您遇到麻烦后来.(它还明确表示您的类适合WCF使用).但只要默认行为符合您的需求,它就不是严格要求的.


回应您的后续行动:

据我所知,没有完全外部的方法来改变DataContractSerializer给定类的序列化行为; 每个选项都要求序列化的类至少有一定程度的归属.正如@Yair Nevet在下面描述的那样,我将现有域对象转换为数据契约的首选方法是MetadataType属性.

或者,您可以通过执行问题中的建议来绕过整个问题:不要序列化域对象,而是创建自定义DTO对象并将其序列化.每当我使用实体框架时,我倾向于这样做,因为序列化这些可能很棘手.如果您的域对象内置了大量行为,这也是一种很好的方法 - 您可以清楚地分离"传递数据"与"参与我的业务逻辑的对象".

您经常会遇到大量冗余代码,但它确实实现了对现有对象进行零更改的目标.