Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net web api 加载插件时,如何在通用控制器上设置api版本?_Asp.net Web Api_Controller_Swagger_Swashbuckle_Api Versioning - Fatal编程技术网

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

Asp.net web api 加载插件时,如何在通用控制器上设置api版本?,asp.net-web-api,controller,swagger,swashbuckle,api-versioning,Asp.net Web Api,Controller,Swagger,Swashbuckle,Api Versioning,我有一些插件,基本上是输入和输出类型定义。我有一个通用控制器,可以添加到mvc管道中。一切正常 但是在这个通用控制器上设置api版本时遇到了问题。我知道您可以基于控制器类顶部的属性来设置它。但是,由于您不能拥有此动态(属性)但不允许它,因此我无法为通用控制器的每个实例设置版本 目前,我只是在运行时为每个实例编译控制器,并使用roslyn编译器注册i 是否有一种方法可以在mvc管道中注册控制器的管道中的某个地方设置api版本,并以不同的api版本终结。这可以通过使用api约定来实现。它被设计来支持

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

但是在这个通用控制器上设置api版本时遇到了问题。我知道您可以基于控制器类顶部的属性来设置它。但是,由于您不能拥有此动态(属性)但不允许它,因此我无法为通用控制器的每个实例设置版本

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


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

这可以通过使用api约定来实现。它被设计来支持这种类型的场景:

这只适用于封闭的泛型,但要做到这一点不需要太多的工作。以下是几个基本示例:

//类型化的、封闭的泛型
options.Conventions.Controller().HasApiVersion(1,0);
//非类型化、封闭泛型
var controllerType=typeof(GenericController).MakeGenericType(new[]{typeof(PlugIn1)});
options.Conventions.Controller(controllerType).HasApiVersion(1,0);
您还可以编写自己的自定义约定a laIControllerConvention。此方法可用于对继承自
GenericController
的所有控制器进行版本设置。然后您只需将其添加到约定中,如下所示:

options.Conventions.Add(新插件InControl智能驭享创新());

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

好的,谢谢您的回复。我已经看过文件了。这在启动时可能是可行的。稍加调整-->.HasApiVersion(新的ApiVersion(1,0));但由于我没有在启动时加载插件,我想知道这种方法是否适合我。我想知道是否应该在功能提供程序中使用IServiceCollection服务。这是我在功能插件提供程序中使用的:iaapplicationfeatureprovider)===feature.Controllers.Add(controllerPluginType.MakeGenericType(inputType.GetTypeInfo());===我可以在这一点上添加ApiVersion吗?这在技术上应该是可能的,但是您可能需要建立约定,然后自己应用它们。默认情况下,API版本约定通过自定义IAApplicationModelProvider应用。不必加载控制器,但必须知道其类型。如果你拖延时间,一旦你发现了这些约定,你就需要应用它们。如果插件控制器、它们的路由和它们的API版本不与其他控制器重叠,那么这应该是好的;否则,API版本集将无法正确聚合。我不确定您加载控制器的确切时间或方式,但应用条件的合理时间是通过自定义IActionDescriptorChangeProvider服务。您可以通过向服务中注入
IOptions
来获得现有的约定,或者您可以强制创建一个新实例a la
new ApiVersionConventionBuilder()
,然后将约定应用于每种控制器类型。这应该让你开始。