【问题标题】:does enriching Poco or Inteface, force recompile?丰富 Poco 或 Interface 会强制重新编译吗?
【发布时间】:2012-01-24 21:52:56
【问题描述】:

我正在编写一些服务。

我针对 2 种情况提出 2 个问题:

情况

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

2) 我通过网络使用它,作为 webService

问题

一)

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

我是否必须重新编译它的所有客户端才能识别

即使他们不使用新方法,新接口?

B)

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

其中一个客户端使用相同的 Poco 类型调用该方法,但该 Poco 在客户端代码中定义为具有 a、b 和 c、d 的类型。

我必须重新编译服务吗?合同是否违约?

【问题讨论】:

  • 接口应该被认为是不可变的,无需重新编译。也就是说,.Net 和 Mono 的当前实现通常允许向后兼容的更改而不会损坏。我强烈建议不要依赖它。

标签: c# asp.net oop interface


【解决方案1】:

对于 Web 服务,如果您确定会发生更改,您可能需要设计一个“版本化”接口,该接口采用通用参数和版本号。我已经使用一个 XML 字符串来完成此操作,该字符串包含传递的参数的内容(将 XML 字符串传递给 Web 服务一个 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 编码参数的方式。允许添加新方法,但调用客户端在重新编译之前不会“看到”它们。

【讨论】:

    猜你喜欢
    • 2011-08-29
    • 2011-06-11
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多