Asp.net core web api - 扩展属性路由生成
Asp.net core web api - extending attribute route generation
假设我想让人们为我的 ASP.NET Core Web API 应用程序创建插件。
插件可以包含使用属性路由的端点:
[Route("[controller]")]
public class SomePlugin: ControllerBase
{
我可以加载这些插件并将 AssemblyPart
添加到 Asp.net 核心中的部件管理器,一切正常 - 到目前为止没问题。
但是假设两个插件都意外地使用了相同的路由。他们有可能不小心相互冲突——一个插件覆盖了另一个插件的路由。我不要这个。
所以我需要做的是确保每个插件/程序集都分配给它自己专用的 URL space 它的路由是相对的。基本上它是自己专用的 Url 基本路径/前缀。
所以在上述插件的情况下,即使开发人员使用了 [Route("[controller]")]
的路由属性 - 我不希望那是最终路由。我想让它相对于该插件唯一的前缀 - 所以我想要生成的实际路线是 [Route("{plugin-prefix}/[controller]")].
这项政策应该有望保证插件不会意外地相互冲突。
希望现在我已经解释了问题,我的问题是,现在 asp.net 核心是否有适当的方法/机制来实现这一点?我正在使用 ASP.NET Core 3.0 和新的端点路由机制。
我自己没试过,不过你应该可以通过
Custom routing convention。像这样:
public class PrefixConvention : IApplicationModelConvention
{
public void Apply(ApplicationModel application)
{
foreach (var controller in application.Controllers)
{
controller.Selectors[0].AttributeRouteModel = new AttributeRouteModel()
{
Template = // "ADD_PREFIX_BASED_ON_CONTROLLER_TYPE"?
};
}
}
}
然后将其添加到 MVC 约定中。
services.AddMvc(options =>
{
options.Conventions.Add(new PrefixConvention ());
});
假设我想让人们为我的 ASP.NET Core Web API 应用程序创建插件。
插件可以包含使用属性路由的端点:
[Route("[controller]")]
public class SomePlugin: ControllerBase
{
我可以加载这些插件并将 AssemblyPart
添加到 Asp.net 核心中的部件管理器,一切正常 - 到目前为止没问题。
但是假设两个插件都意外地使用了相同的路由。他们有可能不小心相互冲突——一个插件覆盖了另一个插件的路由。我不要这个。
所以我需要做的是确保每个插件/程序集都分配给它自己专用的 URL space 它的路由是相对的。基本上它是自己专用的 Url 基本路径/前缀。
所以在上述插件的情况下,即使开发人员使用了 [Route("[controller]")]
的路由属性 - 我不希望那是最终路由。我想让它相对于该插件唯一的前缀 - 所以我想要生成的实际路线是 [Route("{plugin-prefix}/[controller]")].
这项政策应该有望保证插件不会意外地相互冲突。
希望现在我已经解释了问题,我的问题是,现在 asp.net 核心是否有适当的方法/机制来实现这一点?我正在使用 ASP.NET Core 3.0 和新的端点路由机制。
我自己没试过,不过你应该可以通过 Custom routing convention。像这样:
public class PrefixConvention : IApplicationModelConvention
{
public void Apply(ApplicationModel application)
{
foreach (var controller in application.Controllers)
{
controller.Selectors[0].AttributeRouteModel = new AttributeRouteModel()
{
Template = // "ADD_PREFIX_BASED_ON_CONTROLLER_TYPE"?
};
}
}
}
然后将其添加到 MVC 约定中。
services.AddMvc(options =>
{
options.Conventions.Add(new PrefixConvention ());
});