返回从WCF Web服务获取的对象

时间:2013-02-26 06:13:03

标签: c# .net wcf design-patterns wrapper

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

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

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

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

或者只使用get set方法包装它:

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

并且知道如何命名新类以避免与WCF引用中的原始类名称产生歧义?

2 个答案:

答案 0 :(得分:0)

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

您可能拥有要向客户公开的每个实体的DTO,并且DTO将具有公开实体所需的所有字段的属性。 @stephenl建议使用诸如值注入器(valueinjecter.codeplex.com)或自动映射器之类的库来帮助您将值从一个对象复制到另一个对象。

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

答案 1 :(得分:0)

实际上,这取决于你是否是消费者。如果您是消费者,则重用类型程序集即可。但是,如果您无法控制消费服务,最好使用具有[DataContract]属性的DTO对象。