Description
This came up after a perf investigation on a recently refactored endpoint. Moving us back from IOptionsSnapshot to IOptionsMonitor knocked off ~100us, nothing else changed.
This option type of ours is fairly costly to create and looking into OptionsManager<TOptions>
showed an obvious clue why we saw issues. OptionsManager
does not just cache the instance for the duration of the DI scope but it also creates from scratch an instance through the factory per scope.
Looking through the docs this is vaguely alluded to (though there are contra-indicators) but after doing a search on SO and blogs on the subject most users seem to focus entirely on the 'you get a constant value during a scope/request' aspect of it.
As nobody (famous last words) seems to care whether it is entirely recreated my question would be:
Why doesn't OptionsManager<TOptions>
cache the result of an IOptionsMonitor.Get
call? (leaving out the backwards compatibility part for the sake of argument)