加载插件时如何在通用控制器上设置 api 版本?

How can i set the api version on a generic controller when loading a plugin?

我有一些基本上是输入和输出类型定义的插件。我有一个通用控制器,我可以将其添加到 mvc 管道中。一切正常。

但我无法在此通用控制器上设置 api 版本。我知道您可以根据控制器 class 顶部的属性进行设置。但是因为你不能有这个动态(属性)不允许它,我没有办法为通用控制器的每个实例设置版本。

目前我只是在运行时为每个实例编译控制器并使用 roslyn 编译器注册我。

有没有一种方法可以在 mvc 管道中注册控制器的管道中的某处设置 api 版本,并以不同的 api 版本端点结束。

这可以通过使用约定 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());

希望这足以让您入门。欢迎提出更多问题。