I am glad you brought this up, because this was originally the reason why we decided not to allow any sort of injection into ConstraintProviders.
In order for the solver to be efficient and effective, score calculation needs to be as fast as possible. Constraints need to be pared to the bone, microsecond-level performance optimizations can have significant impact as the scores are calculated over and over and over again. That's why Constraint Streams are incremental in nature, that's why there's all sorts of indexing, node sharing and filtering.
Putting any remote service call into your scoring function goes directly against constraint performance. That, in turn, decreases your solution quality, therefore increasing your costs. Our decision to isolate ConstraintProviders was made years ago in order to not encourage these anti-patterns.
However, by now we have seen very clearly that people will find a way, through all sorts of "evil" means, such as ThreadLocals, static fields etc. So, going forward, there is no use in fighting - if people want to do bad things, we can hopefully figure out the least bad way for people to do them.
Hopefully this explains why things are the way things are, and that we will eventually do something about this.