如何对中间层.NET应用程序类/方法进行版本设置



我们有一个典型的N层.NET应用程序,它位于我们的数据库和Web API服务层之间。此应用程序由业务层、数据存储库/访问以及相关的DTO和业务对象组成。

我们有适当的解决方案来版本我们的存储过程和Web API端点。问题是版本这个中间层的解决方案,实际的类方法和模式对象。所有谷歌搜索都会得出关于在源代码管理解决方案中对源代码进行版本控制或如何使用Assembly信息进行版本控制的结果,这两者都不是我们所指的,因此结果有限。

例如,我们有两个端点:

api/v1/tax/charges

。。。api/v2/税费

v1必须达到CalculateTaxPctgs方法的一个版本,v2必须达到具有更新的业务逻辑的另一个版本。由于我们更改了v2中一个字段的名称,因此两者都需要使用不同版本的POCO Tax和TaxItems。

易于开发但难以管理且非常严格/静态的解决方案是创建两种不同的方法,CalculateTaxPctgs_V1和CalculateToxPctgs_V2。这似乎不是个好主意。

很难找到最佳实践,甚至很难找到解决这一困境的替代方案。这是一个每天处理数百万个请求的企业应用程序,因此性能极其重要,但代码管理和可靠性也是如此。

我会使用对象继承而不是不同的方法。这样,如果一个方法在不同版本之间保持不变,则不需要以任何方式更改实现。然后,您可以使用某种类型的工厂来创建所需的实例。例如:

public virtual class TaxCalculatorBase {
public virtual ICollection<TaxPercentage> CalculateTaxPercentages() {
DefaultImplementation();
}
}
public sealed class TaxCalculatorV1 : TaxCalculatorBase {
//Same implementation so no need to override
}
public sealed class TaxCalculatorV2 : TaxCalculatorBase {
//Same implementation but with a bit extra
public override ICollection<TaxPercentage> CalculateTaxPercentages() {
base.CalculateTaxPercentages();
ExtraStuff();
}
}
public sealed class TaxCalculatorV3 : TaxCalculatorBase {
//Different implementation
public override ICollection<TaxPercentage> CalculateTaxPercentages() {
NewImplementation();
}
}
public static class TaxCalculatorFactory {
public static TaxCalculatorBase Create(int version) {
switch (version) {
case 1: return new TaxCalculatorV1;
case 2: return new TaxCalculatorV2;
case 3: return new TaxCalculatorV3;
default: throw new InvalidOperationException();
}
}
}
public class CallingClass {
public void CallingMethod(int versionFromURL) {
var calculator = TaxCalculatorFactory.Create(versionFromURL);
var percentages = calculator.CalculateTaxPercentages();
percentages.DoStuffWithThem();
}
}

如果api每次都实现一个全新的版本,那么工厂可以更通用,比如:

public static class MyFactory {
public static TaxCalculatorBase CreateTaxCalculator(int version) {
switch (version) {
case 1: return new TaxCalculatorV1;
case 2: return new TaxCalculatorV2;
case 3: return new TaxCalculatorV3;
default: throw new InvalidOperationException();
}
}
}
//various other methods to create classes which depend on version
}

显然,这取决于您的解决方案是如何组合在一起的,但重定向程序集版本是您可以利用的吗:

https://msdn.microsoft.com/en-us/library/7wd6ex19%28v=vs.110%29.aspx

您可以通过多种方式重定向应用程序以使用不同版本的程序集:通过发布者策略,通过应用程序配置文件;或者通过机器配置文件。

为了解决这个问题,我们实现了动态加载程序集,它可以处理80多个不同的版本。它运行良好。我们不会更改部署的软件(除非有严重的缺陷),因为它是生产系统的一部分,一旦它工作起来,我们就无法中断。

随着时间的推移,我们也有一些关键的更改,比如使用几个不同版本的.NET。为了处理这一问题,我们将请求路由到不同的应用程序部署。

相关内容

  • 没有找到相关文章

最新更新