Welcome

首页 / 软件开发 / WCF / 不使用代码生成工具而共享WCF代码

不使用代码生成工具而共享WCF代码2013-11-26 infoq Jonathan Allen在传统WCF开发时遇到的一个主要问题是代码重用。无论你的服务端类设计得再怎么好,一旦经过代理 (proxy)生成工具的处理,你就只能得到简单的DTO(数据传输对象)。本文将说明如何绕过代理生成工具, 而使得你的客户端和服务端能够共享代码。

为了论述方便,我们在下面的例子中将使用这个服务接口 。

[ServiceContract(Namespace = "https://zsr.codeplex.com/services/")] public interface IInformationService {[OperationContract]Task<zombietypesummarycollection> ListZombieTypes();[OperationContract]Task<zombietypedetails> GetZombieTypeDetails(int zombieTypeKey);[OperationContract]Task<int> LogIncident(SessionToken session, ZombieSighting sighting); }
为了支持.NET 4.5中的async/await关键字,每个方法会返回一个Task或Task<T>对象。

不使用代理生成工具的理由

不可变对象与数据契约

不可变对象较少出错,这一点如今 已被广泛认可了。除非调用数据契约类的代码需要直接编辑某个属性,否则该属性就应该被标记为只读,以避 免发生错误。

这里是一个仅限于只读显示的类的示例。

using System;using System.Runtime.Serialization; namespace Zombie.Services.Definitions{ [DataContract(Namespace = "https://zsr.codeplex.com/services/")] public class ZombieTypeSummary { public ZombieTypeSummary(string zombieTypeName, int zombieTypeKey, string briefDescription = null, Uri thumbnailImage = null){ ZombieTypeName = zombieTypeName; ZombieTypeKey = zombieTypeKey; BriefDescription = null; ThumbnailImage = thumbnailImage;} [Obsolete("This is only used by the DataContractSerializer", true)]public ZombieTypeSummary() { } [DataMember]public string ZombieTypeName { get; private set; } [DataMember]public int ZombieTypeKey { get; private set; } [DataMember]public string BriefDescription { get; private set; } [DataMember]public Uri ThumbnailImage { get; private set; }}}