是否丰富了Poco或Interface,强制重新编译?

时间:2012-01-24 21:52:57

标签: c# asp.net oop interface

我正在写一些服务。

关于两种情况,我问了两个问题:

情况

1)我使用它“内部”,意思是作为引用的dll

2)我在网上使用它,如webService

问题

A)

如果它向某个客户端类公开接口。 现在我在该界面添加了一些方法。

我是否必须重新编译其所有客户端以识别

新界面,即使他们不使用新方法?

B)

如果我服务接口中的方法期望某些PoCo具有属性a,b

并且其中一个客户端调用具有相同Poco类型的方法,但是这个Poco在客户端代码中被定义为具有a,b和之前的一个,以及c,d。

我是否必须重新编译服务?合同是否破裂?

1 个答案:

答案 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编码的参数。允许添加新方法,但调用客户端在重新编译之前不会“看到”它们。