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

时间:2019-06-28 12:48:30

标签: asp.net-web-api controller swagger swashbuckle api-versioning

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

但是我在此通用控制器上设置api版本时遇到了麻烦。我知道您可以基于控制器类顶部的属性进行设置。但是由于您无法拥有此动态(属性),因此我无法为通用控制器的每个实例设置版本。

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

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

1 个答案:

答案 0 :(得分:0)

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

希望这足以帮助您入门。随时问更多问题。