Почему JsonResult должен реализовывать как IActionResult, так и IStatusCodeActionResult?

#c# #asp.net-core #interface #jsonresult

Вопрос:

Документация JsonResult (также мы можем увидеть это, если рассмотрим F12 JsonResult определение в Visual Studio)

Реализует IActionResult, IStatusCodeActionResult

Мой вопрос в том, почему необходимо реализовать оба этих интерфейса ?

В документе IStatusCodeActionResult говорится, что он уже реализован IActionResult

Комментарии:

1. Я не уверен, что понимаю этот вопрос. Если он реализует IStatusActioNResult, он уже неявно реализует IActionResult (поскольку он наследуется от него), вот что говорится в документах. Так в чем же именно заключается ваш вопрос?

2. @Tseng извините за неясность. Я немного перефразирую свой вопрос: Почему это реализовано так: JsonResult : IStatusCodeActionResult, IActionResult вместо того, чтобы просто JsonResult : IStatusCodeActionResult ? Более позднего варианта должно быть достаточно, не так ли ?

3. Это не так, как вы можете видеть в исходном коде . В .NET 5.0 все так, как public class JsonResult : ActionResult, IStatusCodeActionResult в исходном коде

Ответ №1:

Потому что JsonResult нуждается в StatusCode свойства IStatusCodeActionResult и только в методе ExecuteResultAsync (контекст ActionContext).

это сделано для того, чтобы вы могли просто позвонить

 public IActionResult ActionMethod() 
 

из Asp.Net Контроллеры.

Если бы они создали класс таким образом:

 public class JsonResult : IStatusCodeActionResult
 

Затем вам необходимо изменить метод действия на

 public IStatusCodeActionResult ActionMethod()
 

Разработчики теперь не смогут гибко возвращать другие ответы, основанные на взаимодействии с пользователем/клиентом.

Комментарии:

1. Я не уверен, правильно ли я понял ваш ответ. Допустим, они создали такой класс, как JsonResult : IStatusCodeActionResult . В этом случае я все еще могу использовать public IActionResult ActionMethod() , нет ? Потому IStatusCodeActionResult что это уже подтип IActionResult

Ответ №2:

Кредиты на комментарий @Tseng.

Источник для JsonResult здесь не реализует оба интерфейса.