我考虑将ClientBase<T>
包装在一个包装器中,它只会暴露代理接口(T部分)。
我正在考虑这样做可能产生的影响。显然,框架开发人员提出界面保护是有原因的。我唯一能想到的是,有人可以通过将其转换为ICommunicationObject直接调用Close或其他ICommunicationObject方法。
我希望这样做的原因是利用ClientBase<T>
的ChannelFactory缓存以及我不需要维护的一个很好的默认实现。
我们不喜欢使用svcutil或visual studio的自动生成代理,因为这些代理也往往会产生额外的开销,使用中间类进行传输。我们的服务都是.NET双方,我们控制两端,不需要wsdl,发现或svcutil生成的其他功能,我们不希望在接口可用时为所有内容编写包装器方法。我们希望在连接的两端使用完全相同的接口,而不是必须维护两个看起来相同的不同接口的副本。
这种方法的一大优势是,如果我们对界面进行更改,我们只需要重新编译应用程序,而不是为每个使用它的客户端重新生成代理。 (假设更改不会破坏任何现有用法,例如仅添加不会改变现有属性和方法行为的属性或方法)。是的,我知道我们应该对我们的界面进行版本控制..但这也是一个选项。
有人能想到这样做可能会遇到的其他问题吗?如果不编写我们自己的客户端包装器,你能想到一种不同的方式来实现我们想要的东西吗?
编辑:
有趣的是,我找到了一篇CodeProject文章,它基本上就是我在这里建议的:
http://www.codeproject.com/Articles/412363/How-to-Use-a-WCF-Service-without-Adding-a-Service
仍然有理由不这样做。