我正在向现有 API 引入 API 版本控制。现有的 JSON 对其属性名称使用 Pascal 大小写,例如“FooBar”:“foo”。对于 API 的 v2,我想使用常见的驼峰式大小写,“fooBar”:“foo”。我需要保留 v1 Pascal 大小写,这样它就不会影响任何已经在提取该 API 版本的客户端。
我的项目是
- ASP.NET MVC 5.2.7
- ASP.NET 网页 API 5.2.7
- ASP.NET ODATA 7.4.0
- ASP.NET WEB API 版本控制 4.0.0
我的配置如下
public static class WebApiConfig
{
public static void Register(HttpConfiguration configuration)
{
configuration.AddApiVersioning(options => options.ReportApiVersions = true);
var modelBuilder = new VersionedODataModelBuilder(configuration);
AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(x => x.GetTypes())
.Where(x => typeof(IModelConfiguration).IsAssignableFrom(x) && !x.IsInterface && !x.IsAbstract)
.ForEach(t => modelBuilder.ModelConfigurations.Add((IModelConfiguration)Activator.CreateInstance(t)));
var models = modelBuilder.GetEdmModels();
configuration.MapVersionedODataRoutes("odata-bypath", "api/v{apiVersion}", models, builder =>
{
builder.AddService<IODataPathHandler>(Singleton, sp => new DefaultODataPathHandler { UrlKeyDelimiter = Parentheses });
builder.AddService<ODataUriResolver>(Singleton, sp => new UnqualifiedCallAndEnumPrefixFreeResolver { EnableCaseInsensitive = true });
});
configuration.Count().Filter().OrderBy().Expand().Select().MaxTop(null);
configuration.MapHttpAttributeRoutes();
}
}
在阅读了文档,特别是版本化的ODataModelBuilder 之后,我还没有找到一种方法来根据构建模型的 API 版本来更改大小写。我可以让它成为所有帕斯卡套管或所有骆驼套管,但不是 v1 帕斯卡套管和 v2 骆驼套管。
调整上述配置
var modelBuilder = new VersionedODataModelBuilder( configuration )
{
ModelBuilderFactory = () => new ODataConventionModelBuilder().EnableLowerCamelCase()
};
将使用驼峰式外壳(是的,我知道显式调用是不必要的,因为它是默认设置)。然后我构建了自己的扩展方法ODataConventialModelBuilder().EnablePascalCase()
,该方法模仿EnableLowerCamelCase()
了让 Pascal 套管工作的方法。
var modelBuilder = new VersionedODataModelBuilder( configuration )
{
ModelBuilderFactory = () => new ODataConventionModelBuilder().EnablePascalCase()
};
但是,我永远无法知道我正在为哪个版本的 API 构建模型。
有一次,我以为我可以用它OnModelCreating
来添加
((ODataConventionModelBuilder) builder).OnModelCreating += new PascalCaser().ApplyCase;
到每个 v1IModelConfiguration
类,但是一旦我构建了多个模型,它就不起作用了。
有没有办法根据模型的 API 版本更改 JSON 属性命名?