gpt4 book ai didi

asp.net - API 版本控制和在版本更新上重用现有实现

转载 作者:行者123 更新时间:2023-12-05 04:08:36 25 4
gpt4 key购买 nike

我们正在使用 aspnet-api-version对于我们的 API 的版本。虽然图书馆允许 interleaving multiple version implementation在一个 Controller 上。

[ApiVersion( "2.0" )]
[ApiVersion( "3.0" )]
[RoutePrefix( "api/helloworld" )]
public class HelloWorld2Controller : ApiController
{
[Route]
public string Get() => "Hello world v2.0!";

[Route, MapToApiVersion( "3.0" )]
public string GetV3() => "Hello world v3.0!";
}

我们希望将版本特定的 Controller 分开。

我在版本特定的 Controller 和使用这个库时看到的问题是我们必须再次重新实现所有 API 方法,无论它们是否已更改。考虑这个例子

[RoutePrefix("api/v{version:apiVersion}/values")]
[ApiVersion( "1.0" )]
public class ValuesController : ApiController
{
// GET api/values
[Route]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}

// GET api/values/5
[Route("{id:int}")]
[Route, MapToApiVersion( "1.0" )]
public string Get(int id)
{
return id.ToString();
}
}


[RoutePrefix("api/v{version:apiVersion}/values")]
[ApiVersion( "2.0" )]
public class ValuesControllerV2 : ValuesController
{
// GET api/values/5
[Route("{id:int}")]
[Route, MapToApiVersion( "2.0" )]
public string Get(int id)
{
return id.ToString();
}
}

V1 api(使用ValuesController)定义了两个API函数GetGet(ById) .但是 v2 api ValuesControllerV2同时覆盖 Get(ById) , 它必须重新实现或调用 Get 的基方法制作 Get API 在 V2 上可用。

是否有更好的策略,我们不必为 API 升级时保持不变的所有函数重新实现或编写传递。

最佳答案

首先,我建议评估您的版本控制政策。大多数服务作者(和/或公司)都定义了类似N-2 的策略。这将帮助您确定这个问题有多大,或者它是否是一个问题。

可以使用继承,但是有龙。在 Web API 中,您需要做一些额外的事情才能使其正常工作。内置实现不支持继承的 RoutePrefixAttributeRouteAttribute。您还应该考虑到您不能取消继承 一个操作。如果您停用 API,这会使策略变得非常困惑。并非所有版本控制方案都向后兼容或前滚。

我强烈建议您将业务逻辑放在服务之外。公共(public)基类非操作方法或扩展方法可以帮助减少重复代码。如果每个操作的实现都很小,并且您有既定的版本控制策略,那么重复就不是问题。

任何一种方法或两者的结合都应该提供足够的灵 active 。

关于asp.net - API 版本控制和在版本更新上重用现有实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47202945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com