0

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

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

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

有没有办法在 mvc 管道中注册控制器的管道中的某处设置 api-version 并以不同的 api 版本端点结束。

4

1 回答 1

1

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

希望这足以让你开始。随时提出更多问题。

于 2019-06-28T23:57:57.460 回答