Нет, конструкторы не могут ничего вернуть. Но они также не должны.
Лучше всего сделать фильтр исключений , который будет перехватывать любое необработанное исключение и возвращать его клиенту понятным способом.
Примечание: если вы получаете данные из внешнего источника в конструкторе, вы не можете заставить его работать асинхронно , потому что находится в конструкторе. Если это то, что вы делаете в конструкторе контроллера, он заблокирует поток, ожидающий данные. Таким образом, вы можете подумать о том, можете ли вы как-нибудь переместить его в асинхронный метод (и, возможно, даже кэшировать его).
Это не относится к контроллеру, поскольку у вас нет контроля над тем, как он создается, но мой обычный подход, когда мне нужно получить данные, чтобы иметь возможность создать объект, заключается в следующем:
- Создайте статический фабричный метод, такой как
public async Task<MyClass> MyClass.Create()
- Объявите конструктор
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/