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

时间:2019-05-08 15:46:39

标签: c# asp.net-core asp.net-core-webapi

我有一条路由/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功能来允许子例程的{{ 1}}要实现的参数。

另一种选择是让子例程仅使用[FromQuery]来获取其所需的参数,但这并没有声明/记录该例程的输入值-对于测试或代码清晰而言,效果不佳

问题是,ASP.Net Core是否具有允许将请求传递给另一个特定的操作方法(并完成任何必要的依赖项注入)的功能?

1 个答案:

答案 0 :(得分:1)

不,不。但是,所有操作参数都是可选的(如果未提供,则将填充默认值),因此建议的仅接受所有参数的方法可能是最好的选择。如果那是不可接受的,则可以回退以手动将其从Request.Query中删除,但是您需要对此进行自己的验证/绑定(它们都在那里只有字符串)。

也就是说,根据您的问题描述,最好的选择是实际使用单独的路线。实际上,您在与请求资源映射应该如何与HTTP一起使用方面进行了一些斗争。如果您使用不同类型的搜索,每种搜索都需要不同的参数,那么可以将它们视为每种唯一资源。每个人都在做不同的事情,需要不同的投入。考虑一个较低级别的示例,其中直接在域模型上执行所有这些操作,而没有HTTP层。您将如何精确地处理逻辑?您只有一种方法来处理所有可能的搜索类型吗?可能不会。即使您这样做了,在那种情况下您将如何提供参数呢?您是否还不需要允许提供所有可能的参数?

总之,我将删除此代理操作,并将每个单独的搜索类型方法公开为一个操作。搜索类型可以是路线参数。然后,如果您真的想要,您仍然可以执行一个代理操作,该操作简单地从查询中获取搜索类型,然后连同查询的其余部分一起重定向到适当的搜索类型路由。 / p>