我有一些插件,它们基本上是输入和输出类型定义。我有一个可以添加到 mvc 管道的通用控制器。一切正常。
但我无法在这个通用控制器上设置 api 版本。我知道您可以根据控制器类顶部的属性进行设置。但是由于您不能拥有这种动态(属性),因此我无法为通用控制器的每个实例设置版本。
目前我只是在运行时为每个实例编译控制器并使用 roslyn 编译器注册 i 。
有没有办法在 mvc 管道中注册控制器的管道中的某处设置 api-version 并以不同的 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());
希望这足以让你开始。随时提出更多问题。