asp.net-web-api - 加载插件时如何在通用控制器上设置 api 版本?
问题描述
我有一些插件,它们基本上是输入和输出类型定义。我有一个可以添加到 mvc 管道的通用控制器。一切正常。
但我无法在这个通用控制器上设置 api 版本。我知道您可以根据控制器类顶部的属性进行设置。但是由于您不能拥有这种动态(属性),因此我无法为通用控制器的每个实例设置版本。
目前我只是在运行时为每个实例编译控制器并使用 roslyn 编译器注册 i 。
有没有办法在 mvc 管道中注册控制器的管道中的某处设置 api-version 并以不同的 api 版本端点结束。
解决方案
这可以通过使用Conventions API 来实现。它旨在支持这种确切类型的场景:
https://github.com/microsoft/aspnet-api-versioning/wiki/API-Version-Conventions
这仅适用于closed-generics,但要做到这一点不应该做太多的工作。这里有几个基本的例子:
// typed, closed generic
options.Conventions.Controller<GenericController<PlugIn1>>().HasApiVersion(1,0);
// untyped, closed generic
var controllerType = typeof(GenericController<>).MakeGenericType(new []{typeof(PlugIn1)});
options.Conventions.Controller(controllerType).HasApiVersion(1,0);
您还可以编写自己的自定义约定,例如IControllerConvention。这种方法可用于对所有继承自GenericController<>
. 然后你只需要将它添加到这样的约定中:
options.Conventions.Add(new PlugInControllerConvention());
希望这足以让你开始。随时提出更多问题。
推荐阅读
- python - 在没有互联网访问的情况下安装 python 模块
- sql - SQL 计数未确认的警报
- reactjs - React 如何在 Gatsby 上工作(静态生成?)
- linux - 需要一个脚本来使 vpn 在 bash 中持久化
- matlab - matlab:如何修复必须返回向量的均值/众数/中值的函数
- css - 在元素中使用定义的高度 (vh) 时,Boostrap 网格、溢出滚动和响应式布局的问题
- r - R结合数据框/删除行与条件
- apache - htaccess 301 重定向与一个链接的异常
- python - 改变 difflib.make_file() HTML Table 的宽度?
- python - Django If 语句在模板中不起作用