我正在开发必须支持向后兼容性的客户端-服务器应用程序(.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/