Я бы предложил определенное умственное изменение здесь к функциональному программированию.
Думайте о sessionID
как о потоке независимых значений, а не отдельного объекта. Тогда ваша проблема может быть переопределена следующим (семантически эквивалентным) способом: учитывая типизированный поток (string
в вашем случае), как наблюдать его поток и реагировать на поступающие изменения , который ваш исходный код не контролирует?
Ну, есть ответ, подтвержденный Enterprise ™: реактивные расширения .
С технической точки зрения такой сдвиг подразумевает, что вы имеете дело с IObservable<string>
внутри вашего контроллера, который либо может быть введен с помощью стандартного подхода .NET Core DI, либо просто определен конструктором. Это довольно гибко, поскольку rX
предоставляет ваш полностью проверяемый, невероятно мощный набор инструментов для работы с подобными задачами; rX
также совместим с родной Task
и, следовательно, async/await
функцией. Приятным фактом является то, что действительно легко внедрить требуемое поведение из внешнего мира и украсить существующее наблюдаемое более подходящим: итак, вы в безопасности: как только логика обслуживания стороннего поставщика изменяется, вы можете принять свою кодовую базу практически мгновенно и безболезненно.
Что будет внутри этого IObservable<string>
? Ну, я не могу сказать, так как вы не дали достаточно информации. Это может быть интервал , запрашивающий у удаленного сервера, действителен ли текущий sessionID
, а если нет - запускает процедуру relogin и уведомляет своих подписчиков о новом значении; это может быть таймер , отвечающий за известное правило истечения времени компиляции, это может быть настолько сложная логика, сколько вам нужно: rX
достаточно гибок, чтобы не ограничивать вас тем, чего можно достичь с его помощью до тех пор, пока как вы имеете дело с (возможными бесконечными) потоками.
Как следствие, это означает, что вам не нужно глобальное значение. Просто подпишитесь на поток идентификаторов сеансов и получите последний - тот, который в настоящее время действителен, сделайте работу и утилизируйте вашу подписку. Это не дорого и не будет ухудшать производительность; ни один не испортит конкуренцию. Оберните rX
в Task
и await
, если хотите придерживаться обычного способа .NET.
P.S. 99% того, что вам потребуется для реализации, уже есть; вам просто нужно объединить это.