我们使用aspnet-api-version作为我们 API 的版本。虽然该库允许在一个控制器上交错实现多个版本。
[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!";
}
我们希望将特定于版本的控制器分开。
我看到的版本特定控制器和使用这个库的问题是,我们必须再次重新实现所有 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 函数Get
和Get(ById)
. 但是 v2 apiValuesControllerV2
在覆盖Get(ById)
时,它必须重新实现或调用基本方法Get
以使Get
API 在 V2 上可用。
有没有更好的策略,我们不必为所有在 API 升级时保持不变的函数重新实现或编写传递。