Unity переносит исключение в ResolutionFailedException.Как избежать? - PullRequest
2 голосов
/ 23 августа 2011

Я хочу знать, есть ли возможность попросить Unity «не переносить какие-либо исключения пользователя во время разрешения»?

Действительно, почему Unity делает обертки в ResolutionFailedException?Это меняет «контракт на оказание услуг по строительству», ИМХО факт инициализации объектов с использованием единицы должен быть прозрачным, то есть если клиент, ожидающий, например, IOException от оператора «new», должен его развернуть, даже если объект создан с использованием Unity.

Другие контейнеры IoC ведут себя так же?

Ответы [ 4 ]

2 голосов
/ 23 августа 2011

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

Я знаю, что это не совсем удовлетворительный ответ, но я не знаю, что вы можете отключить это поведение в Unity - я также делаю согласен, что это странное дизайнерское решение ...

Однако, если вы оставите ваши конструкторы простыми, у вас не возникнет этой проблемы.

1 голос
/ 24 августа 2011

Причина, по которой Unity переносит исключения, заключается в контракте - контракте метода Resolve.

Что должно поймать приложение при броске Resolve? Предположим, вы разрешили класс, который, как вы знаете, выдает IOException. Таким образом, вы помещаете ловушку для этого исключения вокруг вызова разрешения.

Тогда реализация изменится. Или просто конфигурация. Теперь сервисы выбрасывают что-то еще.

Теперь у вас есть изменение конфигурации, которое потребует изменения кода. Не хорошо.

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

1 голос
/ 23 августа 2011

Выезд ResolutionFailedException.InnerException.

меняется "договор на строительные работы"

Какой контракт?

ИМХО факт инициализации объектов с использованием единицы должен быть прозрачным

Смысл контейнеров IoC состоит в том, чтобы сделать объектное внимание менее сфокусированным, чтобы разработчики могли сосредоточиться на добавлении ценности для бизнеса.

это означает, что если клиент ожидает, например, IOException от оператора "new", он должен развернуть его, даже если объект создан с использованием Unity.

Ого, какой клиент использует контейнер, ожидающий IOException? Я думаю, что вы могли неправильно использовать свой контейнер IoC.

0 голосов
/ 28 октября 2017

У меня была похожая потребность, и я нашел решение здесь: перехват всех необработанных исключений в ASP.NET Web Api

Вот что я узнал, просматривая ответы из связанной статьи:

  • Если вы хотите перехватывать и регистрировать только исключения, добавьте IExceptionLogger.
  • Если вы хотите перехватить исключение и манипулировать ответом, заменяет IExceptionHandler.
  • Ни одно из решений не фиксирует ВСЕ исключения. Я все еще использую Application_Error для захвата исключений, которые не обнаруживаются в моих методах ApiController.
...