c# - 客户端兼容性检查管理

标签 c# .net wcf c#-4.0 client-server

我正在开发必须支持向后兼容性的客户端-服务器应用程序(.NET 4、WCF)。换句话说,旧客户端应该与新服务器兼容,反之亦然。因此,我们的客户端代码中充斥着如下语句:

if (_serverVersion > new Version(2, 1, 3))
{
    //show/hide something or call method Foo()...
}
else
{
   //show/hide something or call method Foo2()...
}

显然,这有点像维护的噩梦。幸运的是,我们被允许打破与每个次要版本的向后兼容性。当我们到达可以破坏兼容性的地步时,我想清理上述示例形式的代码。

我的问题:

(1) 当这些代码块不再“有效”时,有没有一种方法可以轻松识别它们?我最初的想法是以某种方式有条件地根据程序集的版本应用过时的属性。当我们进入一个新的次要版本时,Obsolete 属性会“启动”,突然间我们会有几个指向这些代码块的编译器警告......有没有人做过这样的事情?或者有更好的方法来管理它吗?

(2) 每次看到诸如 new Version(2, 1, 3) 之类的硬编码版本时,我都会感到畏缩。更糟糕的是,在开发过程中,我们并不知道发布的最终版本,因此当开发人员添加检查时,版本检查基于当前内部版本号 + 1。虽然这有效,但它不是很干净。关于如何改进这方面的任何想法?

谢谢!

最佳答案

我建议至少创建一个方法,您可以在其中执行如下逻辑:

public static class ServerUtilities
{
    public static bool IsValidToRun(Version desiredVersion)
    {
        if (_serverVersion >= desiredVersion)
            return true;
        else if (/* your other logic to determine if they're in some acceptable range */)
            return true;

        return false;
    }
}

然后,像这样使用:

if (ServerUtilities.IsValidToRun(new Version(2, 1, 3)))
{
    // Do new logic
}
else
{
    // Do old logic
}

如果你需要集中版本,有一个特性到版本映射的静态存储库,这样你就可以调用:

if (ServerUtilities.IsValidToRun(ServerFeatures.FancyFeatureRequiredVersion))
{
    ...
}

public static class ServerFeatures
{
    public static Version FancyFeatureRequiredVersion
    {
        get { return new Version(2, 1, 3); }
    }
}

关于c# - 客户端兼容性检查管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10011690/

相关文章:

c# - 组织 using 指令,重新运行测试?

c# - 自定义属性的命名约定和指南

c# - 面向方面编程的替代方案

.net - 为什么我本地 WCF 客户端的 IP 不是 127.0.0.1?

c# - 错误: Message Queuing failed to verify digital signature of a message sent to queue

c# - 带单引号的 SQL 查询

c# - 我将如何为 System.Data.Linq.Table<T> 编写扩展方法?

c# - 从 XML 文件导入图像

.net - 无法启动应用程序 "WcfTestClient.exe"

wcf - 使用 WCF 时如何验证证书在其证书链中是否具有特定 CA