|
|
1
1
我们已经讨论过在企业应用程序内部这样做,在企业应用程序中,我们控制应用程序的两个方面,以提高.NET客户端的生产率。这件事还没有定论。 但是,当讨论在共享库中(在客户机和服务之间)拥有契约时,通常包括 二者都 服务 合同([服务合同]),以及 实体 ([DataContract]),用于服务操作的任何参数。这些类型传统上是 混凝土 在您的例子中,DTO实现了一个接口,比如iccustomer,实现了表示客户的属性,并且是一个[DataContract]。假设类型将正确地序列化到服务(使用NetDataContractSerializer),那么我认为客户机几乎可以推送他们想要的任何具体实现—服务只对符合ICustomer的内容感兴趣。 . 例如
我不确定你的目标能否实现零客户影响。如果您更改接口类型(将属性添加到ICustomer),您的客户机将需要重新编译。如果您添加一个参数,即使是核心.NET类型的参数(例如int),您的客户机也需要重新编译。这实际上与客户端更新其服务引用和重新编译的影响相同。 但是,如果 更改服务实现或行为(例如bug修复),然后 案例(共享类型或服务引用)只要你和你的客户之间的合同不变,客户就不需要做任何事情。当然,我也很想听听你的经验,证明这是错误的! 这种做法也会完全扼杀您与非.NET系统的互操作性。当然,当我把这件事掩盖起来的时候,某个地方的某个部门会听说你的超级spiffy服务并想使用它……他们会运行一些Java堆栈,或者COBOL,或者FORTRAN……等等:) |
|
|
2
1
我在我的WCF开发中遇到了同样的问题。事实是 双方都必须有一个数据契约的具体实现 沟通的方式。那么这些实现从何而来?在服务器端,实现通常是您的业务对象及其所有业务逻辑等等。您不想在客户机上使用这些实现——这意味着将它们放在共享程序集中,您不想这样做有几个原因。因此客户机需要自己的、单独的一组具体类。要么你自己写,要么自动生成。
这两种方法都为您提供了针对接口进行编码的好处:只要接口不变,就可以独立地修改和重建服务器和客户机。在一种情况下,接口是WSDL,而在另一种情况下,接口是CLR接口,但是由于WCF基于CLR接口生成WSDL,所以它们实际上是一个相同的接口。就我个人而言,我喜欢添加服务引用,因为它已经存在了,并且不会向我的项目添加任何依赖项,但是可以选择您更喜欢的。 |
|
|
3
0
嗯,我觉得你把两件事搞混了:
另一方面,正在交换的数据(默认情况下序列化为XML格式)将始终是从WSDL/XSD推断出的具体类(没有接口),同样,客户机不依赖于服务器的类,只依赖于它们的“XML序列化指纹”。
|