WCF - 域对象和IExtensibleDataObject
-
09-06-2019 - |
题
典型情况。我们使用旧式XML Web Services 内部
在服务器场与多个分布式和本地客户端之间进行通信。没有第三方参与,只有我们自己和客户使用的应用程序。
我们目前正在考虑从 XML
WS
转移到 WCF /基于对象的
模型,并且一直在尝试各种方法。其中之一涉及直接通过线路传输域对象/聚合,可能会调用它们上的DataContract属性。
通过 DataMembers
上的Order属性使用 IExtensibleDataObject
和 DataContract
,我们应该能够处理简单的属性版本问题(记住,我们控制所有客户端并且可以轻松地强制更新它们。)
我一直听说我们应该通过线路使用专用的,仅传输数据传输对象( DTOs
)。
为什么呢?还有理由这样做吗?我们在服务器端和客户端使用相同的域模型,当然,只有在被认为是正确的和“必要的”时才预先填充集合等。集合属性利用服务定位器原理和IoC来调用 NHibernate-based
" service"直接(在服务器端)获取数据,以及 WCF
"“service”客户端上的客户端与 WCF
服务器场进行通信。
那么 - 为什么我们需要使用 DTOs
?
解决方案
根据我的经验,DTO对以下方面最有用:
- 严格定义将通过网络发送的内容,并具有专门用于该定义的类型。
- 隔离应用程序,客户端和服务器的其余部分,以防将来的更改。
- 与非网络系统的互操作性。 DTO当然不是必需的,但它们使得设计“安全”更容易。类型。 醇>
在您的场景中,这些设计功能可能并不重要。我已经将WCF与严格的DTO和共享域对象一起使用,并且在两种情况下它都运行良好。我通过网络发送域对象时唯一注意到的是我倾向于发送更多数据(并以意想不到的方式)然后我需要。这可能更多是由于我缺乏WCF经验而不是其他任何事情;但是如果你选择走这条路,那你肯定应该警惕。
其他提示
使用这两种方法(共享域对象和DTO)我会说共享域对象的大问题是当你不控制所有客户端时,但根据我过去的经验,我通常会使用DTO,除非它开发速度至关重要。
如果您有可能无法始终控制客户端,那么我肯定会推荐DTO,因为只要您与其他人的客户端应用程序共享您的域对象,您就会开始将您的内部设备绑定到其他人的开发人员周期。
我还发现DTO在版本化服务环境中工作很有用,这使我们能够从根本上改变应用程序的内部,但仍接受对旧版本服务接口的调用。
最后,如果你有很多客户端应用程序,那么使用DTO也可能是有益的,因为你可以使用易于版本化的服务进行保护。