我有一个函数返回从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引用中的原始类名称产生歧义?
答案 0 :(得分:0)
正如您所知,强制客户端使用与服务器相同的类型并不是一个好主意。这将不必要地将服务器应用程序架构暴露给客户端。最好的选择是使用数据传输对象(DTO)。
您可能拥有要向客户公开的每个实体的DTO,并且DTO将具有公开实体所需的所有字段的属性。 @stephenl建议使用诸如值注入器(valueinjecter.codeplex.com)或自动映射器之类的库来帮助您将值从一个对象复制到另一个对象。
将DTO放在单独的命名空间和程序集中,以实现最佳的物理分离。您可以使用 YourCompany.YourProduct.Data.Entities 作为实体的命名空间,使用 YourCompany.YourProduct.Data.DTO 作为DTO
答案 1 :(得分:0)
实际上,这取决于你是否是消费者。如果您是消费者,则重用类型程序集即可。但是,如果您无法控制消费服务,最好使用具有[DataContract]
属性的DTO对象。