UPDATE 调整为“每种方法都需要不同的api版本”解决方案。
摘要客户端逻辑接口:
public interface IApiClient
{
void Foo();
int GetCurrentVersion();
}
做一个属性的方法,通过法API版本:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public sealed class ApiVersionRangeAttribute : Attribute
{
public int MinVersion { get; private set; }
public int MaxVersion { get; private set; }
public ApiVersionRangeAttribute(int minVersion, int maxVersion)
{
MinVersion = minVersion;
MaxVersion = maxVersion;
}
public void Validate(int version)
{
if (version < MinVersion || version > MaxVersion)
{
throw new Exception("Upgrade");
}
}
}
,并创建一个工厂,将采取该属性到一笔账:
//nuget: Install-Package Castle.Core
using System;
using Castle.DynamicProxy;
public class ApiClientFactory
{
public class ApiClient : IApiClient
{
[ApiVersionRange(10, 20)]
public void Foo()
{
Console.Write("Foo");
}
public int GetCurrentVersion()
{
// call to the server here instead :)
return 50;
}
}
public IApiClient CreateClient()
{
var generator = new ProxyGenerator();
var apiClient = generator.CreateInterfaceProxyWithTarget<IApiClient>(
new ApiClient(), new VersionInterceptor());
return apiClient;
}
}
public class VersionInterceptor : StandardInterceptor
{
protected override void PreProceed(IInvocation invocation)
{
var attributes = invocation.MethodInvocationTarget.GetCustomAttributes(
typeof(ApiVersionRangeAttribute), false);
if (attributes != null && attributes.Length == 1)
{
var apiRange = (ApiVersionRangeAttribute)attributes[0];
var proxy = (IApiClient)invocation.Proxy;
apiRange.Validate(proxy.GetCurrentVersion());
}
base.PreProceed(invocation);
}
}
使用范例:
var apiClient = new ApiClientFactory().CreateClient();
// fail - 50 is not in range 10-20
apiClient.Foo();
所以你检查你的服务器的API版本的使用情况如何?这对我来说没有意义。此外,您所做的选择实际上并没有太大的差别,显然将功能提取到另一个功能更好。虽然我会使用某种钩子而不是在每个api调用中调用它。 – Glubus
MS使用V2。您也可以尝试代码合同。这就是说,你的问题是基于意见的。 –