ASP.Net Core возвращает результат из конструктора - PullRequest
0 голосов
/ 08 ноября 2018

В моем приложении конструктор контроллера используется для создания начальных объектов свойств, с которыми работают другие методы контроллера. Я хотел убедиться, что если по какой-то причине конструктор не может создать необходимые объекты и выдает исключение, IActionResult все равно будет возвращен обратно.

Однако, поскольку конструктор не имеет возвращаемого типа, я не могу использовать что-то вроде:

return Ok(new myAspResponse<myObject>(myObjectInstance));

Есть ли способ добиться чего-то подобного с помощью инъекций зависимостей?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Конструктор имеет неявный тип возврата самого класса; вы не можете «вернуть» что-то из этого. Если оно выдает исключение, оно будет перехвачено промежуточным программным обеспечением обработки исключений в ASP.NET Core, где вы можете настроить возвращаемую пользовательскую страницу ошибки. Смотри: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-2.1

0 голосов
/ 08 ноября 2018

Нет, конструкторы не могут ничего вернуть. Но они также не должны.

Лучше всего сделать фильтр исключений , который будет перехватывать любое необработанное исключение и возвращать его клиенту понятным способом.

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

Это не относится к контроллеру, поскольку у вас нет контроля над тем, как он создается, но мой обычный подход, когда мне нужно получить данные, чтобы иметь возможность создать объект, заключается в следующем:

  1. Создайте статический фабричный метод, такой как public async Task<MyClass> MyClass.Create()
  2. Объявите конструктор private, чтобы он не мог использоваться вне моего Create() метода.

Это может пригодиться, если вам придется делать это в других классах.

Обновление: В вашем конкретном случае создания «объекта пользователя из поставляемого токена», это звучит как лучшая работа для AuthenticationHandler. Он предназначен именно для этой цели. Вы можете взглянуть на пример здесь (это сравнивает .NET Core 1.0 с 2.0, но вы можете просто посмотреть на раздел 2.0, если это то, что вы используете): https://geeklearning.io/how-to-migrate-your-authentication-middleware-to-asp-net-core-2-0/

...