我正在写一些服务。
关于两种情况,我问了两个问题:
情况
1)我使用它“内部”,意思是作为引用的dll
2)我在网上使用它,如webService
问题
A)
如果它向某个客户端类公开接口。 现在我在该界面添加了一些方法。
我是否必须重新编译其所有客户端以识别
新界面,即使他们不使用新方法?
B)
如果我服务接口中的方法期望某些PoCo具有属性a,b
并且其中一个客户端调用具有相同Poco类型的方法,但是这个Poco在客户端代码中被定义为具有a,b和之前的一个,以及c,d。
我是否必须重新编译服务?合同是否破裂?
答案 0 :(得分:0)
对于Web服务,如果您某些将发生更改,您可能需要设计一个带有通用参数和版本号的“版本化”接口。我使用XML字符串来完成此操作,该字符串包含传递的参数的内容(传递给Web服务的XML字符串是HTML编码的,以避免破坏SOAP信封)。 在Web服务方法中,检查版本号比继续将XML解析为该方法的预期类型:
public void GenericWebServeceMethod(int version, string encodedXMLParameters)
{
string xmlParameters = HTMLDecode(encodedParameters);
switch(version)
{
case 1:
ParameterType1 p1 = DecodeVersion1XML(xmlParameters);
MethodVersion1(p1);
break;
case 2:
ParameterType2 p2 = DecodeVersion2XML(xmlParameters);
MethodVersion2(p2);
break;
}
}
添加新版本时,您可以使用新版本扩展switch语句,这仍然允许使用旧版本参数类型的客户端继续工作。
对于使用'内部'的引用DLL,您可以通过使用Visual Studio中的“浏览”选项添加引用,然后选择引用的属性并确保“特定版本”来强制引用与版本无关属性设置为False
。然后,您仍然可以使用类似于上述的系统来更改方式,而不是基于传递的版本号处理XML编码的参数。允许添加新方法,但调用客户端在重新编译之前不会“看到”它们。