.net WCF:我应该如何在客户机和服务器中维护契约类?

.net WCF:我应该如何在客户机和服务器中维护契约类?,.net,wcf,client-server,.net,Wcf,Client Server,我正在使用一个服务器和一个客户端开发一个WCF应用程序(当然)。在服务器项目中,我使用合同属性定义了类 现在,当服务器准备就绪时,我添加了服务引用,它为我创建了代理。我用过它,它确实很好用 我想问的问题是,如果我创建一个包含类定义和契约属性的公共DLL并将其用于服务器和客户端(而不是使用Visual Studio为客户端生成的类),可以吗。如果我使用公共类,我就不必担心在自动生成代码时泛型集合被转换成数组。这很傻吗?可能吗?以前有人这样做过吗?这样可以吗 部署场景是这样的:在一个安全的intra

我正在使用一个服务器和一个客户端开发一个WCF应用程序(当然)。在服务器项目中,我使用合同属性定义了类

现在,当服务器准备就绪时,我添加了服务引用,它为我创建了代理。我用过它,它确实很好用

我想问的问题是,如果我创建一个包含类定义和契约属性的公共DLL并将其用于服务器和客户端(而不是使用Visual Studio为客户端生成的类),可以吗。如果我使用公共类,我就不必担心在自动生成代码时泛型集合被转换成数组。这很傻吗?可能吗?以前有人这样做过吗?这样可以吗

部署场景是这样的:在一个安全的intranet中,客户端数量有限(很少),只要服务器发生变化,就可以更新现有的客户端。

这种方法很好(我经常使用),只要您控制客户端。它(显然)不适用于java客户机等。如果您知道永远不需要支持非.NET客户机,那么它可能很强大,但它打破了一些纯粹的SOA规则。特别是,是的,Intranet场景是我可以考虑这种方法的一个例子。 svcutil.exe和IDE都可以选择重用现有程序集中的类型来完成此操作


编辑这种方法的另一个优点是,如果您希望在客户端使用相同的验证逻辑,而不需要对其进行两次编码,例如
IDataErrorInfo
等。

如果您唯一关心的是不将集合转换为数组,那么您不必走这么远。“添加服务引用”对话框上的“高级”按钮允许您指定用于此类情况的类型。您可以让它使用列表而不是T[]。

在一个单独的公共程序集中维护契约类型是一个非常好的主意。它使您有机会添加,例如,在合同类型和您可能拥有的其他业务对象之间转换,或者在这些类型之间添加中介,等等

即使不能控制所有客户机,使用公共类型也是有意义的。假设您拥有一项服务,该服务由使用.NET的内部应用程序以及合作伙伴公司中受信任的第三方使用。合作伙伴应用程序使用Java、Ruby或Python。在这种情况下,合作伙伴将无法访问共享类型,但依赖于WSD/XSD,可以滚动他们自己的客户端类型库。这不应妨碍您向内部开发人员提供一个很好的共享类型包

当您使用REST接口而不是WS/SOAP时,共享类型的建议也适用。对于REST,虽然缺少WSDL,但XSD(或类似的)仍将用于描述服务器及其客户机交换的消息类型。因此,无论您是使用SOAP还是REST,Advice都没有变化


编辑:无论您使用.NET、Java还是其他任何东西,它都适用。如果控制导线的两端,且平台相同,则应共享类型。为什么不呢?

一旦创建了单独的程序集来保存合约,您就可以引用这些程序集,并使用它们创建从客户端到服务的通道(使用)。通过这样做,您不再需要在每次更改服务合同时更新“服务引用”

ChannelFactory<IContract> factory = 
    new ChannelFactory<IContract>("endpointName");
ChannelFactory工厂=
新ChannelFactory(“端点名称”);

不仅仅如此。只要这些类发生更改,它就会更新服务引用。当IDE生成的代码更少时,它也会感觉更舒适。我只是想确保,如果我遵循这种方法,我不会做一些禁忌或严重违反标准/指导原则的事情。好吧,您不必在每次更改时更新服务引用—只有在您更改合同时。我希望你不要经常这样做。您也可以考虑使用服务工厂()。它将同时更新客户端和服务。