加载插件时如何在通用控制器上设置 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());
希望这足以让您入门。欢迎提出更多问题。
我有一些基本上是输入和输出类型定义的插件。我有一个通用控制器,我可以将其添加到 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());
希望这足以让您入门。欢迎提出更多问题。