2013-02-26 103 views
0

我有一个函数返回从WCF Web服务获得的实体。我应该如何返回这个实体?我不认为我可以返回原始对象(来自Web服务),因为这意味着函数的调用者(来自其他程序集)将被强制引用该Web服务的服务引用(因为该类是在服务参考),我想我想避免这种情况。而且我也不认为我可以使用接口,因为我无法修改WCF实体来实现我的接口。返回从WCF Web服务获得的对象

另一方面,我需要精确返回原始实体具有的所有属性,例如。所有属性都需要存在,并且不需要对任何值或任何属性名称和类型进行转换/调整。

是否更好创建一个新的类,从原始的WCF类复制相同的属性?我应该如何实现它,创建一个新的对象来复制原始对象的所有值比较好,

return new Foo() { Id = original.Id, Name = original.Name ...等}

或只是获取设置的方法,如把它包:

public int Id 
{ 
    get { return _original.Id; } 
    set { _original.Id = value; } 
} 

而且知道怎样来命名新的类,以避免从WCF参考原来的类名歧义?

+0

或者使用类似Automapper的类将一个类转换为另一个类? – stephenl 2013-02-26 06:22:53

回答

0

正如您所想的那样,强制客户端使用与服务器相同的类型并不是一个好主意。这会不必要地将服务器应用程序架构暴露给客户端。最好的选择是使用数据传输对象(DTO)。

对于您希望公开给客户端的每个实体,您可能都有DTO,并且DTO将具有公开该实体的所有必填字段的属性。如@stephenl所建议的库,如值注入器(valueinjecter.codeplex.com)或自动映射器,以帮助您将值从一个对象复制到另一个对象。

将DTO放置在单独的命名空间和程序集中以实现最佳物理解耦。您可以使用YourCompany.YourProduct.Data.Entities的命名空间实体和YourCompany.YourProduct.Data.DTO的DTO的

+0

是真的,甚至认为他必须返回与WCF返回相同的DTO,最重要的是,因为包含WCF代理的dll必须在本地可用于他的应用程序工作,客户端的应用程序将有权访问所有WCF DTO和合同代理提供的功能。 – user1416420 2013-02-26 07:04:32

0

其实,这取决于你是否是消费者。如果你是消费者,重新使用类型组件是可以的。但是,如果您不控制消费服务,则最好使用具有[DataContract]属性的DTO对象。