0

我有一个返回从 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 参考中的原始类名产生歧义吗?

4

2 回答 2

0

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

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

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

于 2013-02-26T06:56:28.597 回答
0

其实这要看你是不是消费者。如果您是消费者,则可以重用类型程序集。但是,如果您无法控制消费服务,最好使用具有[DataContract]属性的 DTO 对象。

于 2013-02-28T12:47:32.443 回答