Изображение, на которое вы смотрите, на самом деле не показывает, что они могут повторно выполнить конвейер. Вместо этого изображение пытается сказать, что фильтр ресурсов может закорачивать конвейер (например, возвращая кэшированный результат), и что он будет выполнен после повторной фильтрации результатов (например, для кэширования результатов для более поздних запросов).
Повторное выполнение самого конвейера фильтра MVC невозможно. Это происходит главным образом потому, что нет способа перенастроить контекст выполнения для отдельного выполнения.
Однако, что вы можете сделать, это повторно запустить конвейер промежуточного программного обеспечения. ExceptionHandlerMiddleware
делает это, например, для отображения результата конечной точки обработки исключительной ситуации, когда она перехватывает исключение. Это достигается путем изменения параметров запроса (например, HttpContext.Request.Path
) и повторного вызова промежуточного программного обеспечения (т.е. next()
).
Поскольку промежуточное программное обеспечение действует непосредственно на объекты HttpRequest и HttpResponse, это, конечно, означает, что логика должна быть намного более низкого уровня. Например, вы не можете просто взять ObjectResult
и скорректировать этот результат, чтобы включить другое значение. Вместо этого вам придется работать над уже сериализованным результатом JSON.
К сожалению, хотя это теоретически сработало бы, я бы на самом деле ожидал, что это будет довольно болезненно реализовать. В конце концов, вам придется десериализовать результаты, которые вы только что сериализовали, чтобы снова их сериализовать и т. Д. Это, вероятно, также повлияет на производительность.
Вместо этого я хотел бы предложить вам добавить еще один уровень абстракции, который, по сути, снимает ответственность за создание результата с платформы ASP.NET Core. Вместо того, чтобы полагаться на это для создания своего результата, а затем на необходимость его повторного выполнения для заполнения ссылочных ссылок, вместо этого вызовите что-то другое, что может построить как ваш результат, так и ссылочные ссылки отдельно. Таким образом, действие контроллера было бы просто оркестратором для этого.
Возможно, вы могли бы сделать это с MediatR , довольно простой, но мощной реализацией посредника. Это позволит вам полностью представить свою логику вне ASP.NET Core и его концепции, основанной на HTTP (что также будет полезно для тестируемости), а также даст вам возможность рекурсивно вызывать себя (чтобы поместить результаты в свои результаты). Кроме того, он имеет собственную концепцию конвейера, которая позволит вам абстрагировать это в общий компонент, так что каждому обработчику запросов придется заботиться только об уровне непосредственных запросов.