繁体   English   中英

可以调用操作方法(从操作方法)并让ASP.Net Core注入[FromQuery]参数吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM