Можно ли вызвать метод действия (из метода действия) и позволить ASP.Net Core вводить параметры [FromQuery]? - PullRequest
0 голосов
/ 08 мая 2019

У меня есть маршрут /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 и передать их в подпрограммы соответствующим образом, но это громоздко / грязно ... было бы неплохо, если бы я мог как-то вызвать подпрограммы и просто позволить им указать желаемые параметры запроса, поэтому main GetStuff не нужно было бы заботиться (это, вероятно, потребовало бы использования некоторых функций ASP.Net Core IoC, чтобы можно было выполнить параметры [FromQuery] подпрограммы).

Другим вариантом было бы просто использовать подпрограммыRequest.Query чтобы получить желаемые параметры, но это не объявляет / не документирует входные значения для подпрограммы - что не так хорошо для тестирования или ясности кода.

Вопрос в том, поддерживает ли ASP.Net Core имеет функциональность, позволяющую передавать запрос другому, определенному методу действия (и выполнять любые необходимые инъекции зависимостей)?

1 Ответ

1 голос
/ 08 мая 2019

Просто нет.Тем не менее, все параметры действий являются необязательными (они будут заполнены значениями по умолчанию, если они не предоставлены), поэтому предложенный метод простого принятия всех параметров, вероятно, является лучшим выбором.Если это неприемлемо, вы можете вернуться к получению их вручную из Request.Query, но вам нужно будет выполнить свою собственную проверку / привязку с этим (все они будут просто строками).

Это сказалоИсходя из описания вашей проблемы, вам лучше всего использовать отдельные маршруты.По сути, вы немного боретесь с тем, как отображение ресурсов запросов должно работать с HTTP.Если у вас есть разные типы поиска, каждый из которых требует разных параметров, то каждый из них может рассматриваться как уникальный ресурс.Каждый делает что-то свое и требует разного вклада.Рассмотрим низкоуровневый пример, где вы делали все это непосредственно в модели домена без уровня HTTP.Как именно вы справитесь с логикой?У вас был бы только один метод для обработки всех возможных типов поиска?Возможно нет.Даже если бы вы сделали, как бы вы предоставили параметры в этом случае?Разве вам по-прежнему не нужно разрешать указание всех возможных параметров?

Длинно и коротко, я бы удалил это прокси-действие и выставил бы каждый отдельный метод поиска в качестве действия.Тип поиска может быть параметром маршрута.Затем, если бы вы действительно хотели, вы все равно могли бы иметь прокси-действие, которое просто получало тип поиска из запроса и перенаправлялось на соответствующий маршрут типа поиска вместе с оставшейся частью запроса.

...