В контейнере инъекции зависимостей Unity есть широко известная проблема, при которой SynchronizedLifetimeManager часто вызывает метод Monitor.Exit, чтобы вызывать исключение SynchronizationLockException, которое затем захватывается и игнорируется. Это проблема для меня, потому что мне нравится отлаживать с помощью Visual Studio, чтобы ломать любое исключенное исключение, поэтому каждый раз, когда мое приложение запускается, я разрываюсь на этом исключении несколько раз без причины.
Как я могу предотвратить выброс этого исключения?
В тех случаях, когда эти проблемы упоминаются в других местах в Интернете, совет обычно включает в себя изменение настроек отладчика, чтобы игнорировать его. Это сродни тому, как идти к доктору и говорить: "Доктор, доктор, моя рука болит, когда я поднимаю его", чтобы сказать: "Ну, перестань поднимать его". Я ищу решение, которое исключает исключение исключения.
Исключение возникает в методе SetValue, потому что он делает предположение, что GetValue будет вызван первым, где вызывается Monitor.Enter. Однако классы LifetimeStrategy и UnityDefaultBehaviorExtension регулярно называют SetValue без вызова GetValue.
Мне не нужно менять исходный код и поддерживать мою собственную версию Unity, поэтому я надеюсь на решение, в котором я могу добавить в контейнер некоторую комбинацию расширений, политик или стратегий, которые гарантируют, что, если диспетчер времени жизни является SynchronizedLifetimeManager, GetValue всегда вызывается перед чем-либо еще.