[英]Possible to call action method (from action method) and let ASP.Net Core inject [FromQuery] params?
我有一条路线/my/route?t=something&...
,该/my/route?t=something&...
由一种操作方法处理,该方法然后打开t
并调用适当的子例程以执行所需的操作。 例如:
[HttpGet("my/route")]
public IActionResult GetStuff([FromQuery(Name = "t")]string searchType)
{
switch (searchType)
{
case "type1":
return getStuff_type1();
case "type2":
return getStuff_type2();
default:
return BadRequest();
}
}
但是,每个子例程都需要其他查询参数(根据子例程的需求,其中一些/许多参数可能会有所不同)。
因此, "type1"
可以接受查询参数“ a”,“ b”,“ c”,“ d”; 和"type2"
可以接受查询参数“ v”,“ w”,“ x”,“ y”,“ z”。
显然,我可以将所有参数(abcdvwxyz,以及其他类型的更多参数)拉入主操作方法GetStuff
并将它们适当地传递到子例程中,但这很麻烦/混乱。如果我能以某种方式调用子例程,那将很好并让他们指定所需的查询参数,这样就不必关心主要的GetStuff
(这可能需要使用一些ASP.Net Core IoC功能才能实现子例程的[FromQuery]
参数)。
另一个选择是让子例程仅使用Request.Query
来获取其所需的参数,但这并没有声明/记录该例程的输入值-对于测试或代码清晰性而言,效果不佳。
问题是,ASP.Net Core是否具有允许将请求传递给另一个特定的操作方法(并完成任何必要的依赖项注入)的功能?
简单地说,不。 但是,所有操作参数都是可选的(如果未提供,则将填充默认值),因此建议的仅接受所有参数的方法可能是最好的选择。 如果这是不可接受的,则可以回退以手动将其从Request.Query
删除,但是您需要对此进行自己的验证/绑定(它们都在那里只是字符串)。
就是说,根据您的问题描述,最好的选择是实际使用单独的路线。 实际上,您在与请求资源映射应该如何与HTTP一起使用方面进行了一些斗争。 如果您使用不同类型的搜索,每种搜索都需要不同的参数,那么可以将它们视为每种唯一资源。 每个人都在做不同的事情,需要不同的投入。 考虑一个较低级别的示例,其中直接在域模型上执行所有这些操作,而没有HTTP层。 您将如何精确地处理逻辑? 您只有一种方法来处理所有可能的搜索类型吗? 可能不是。 即使您这样做了,在那种情况下您将如何提供参数呢? 您是否还不需要允许提供所有可能的参数?
总之,我将删除此代理操作,并将每个单独的搜索类型方法公开为一个操作。 搜索类型可以是路线参数。 然后,如果您确实愿意,您仍然可以执行一个代理操作,该操作简单地从查询中获取搜索类型,然后连同查询的其余部分一起重定向到适当的搜索类型路由。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.