Well, in the Driebit bundle we have:
* a Varnish service that can be used on its own for precise control over Varnish (which has become even more relevant since we're now allowing users to combine ban, purge and refresh requests as they like)
* a CacheManager that acts as a layer between Symfony and Varnish (which then becomes an Adapter). 

This results in a better separation of concerns: users may like to invalidate routes (not paths/URLs) but the Varnish class should have no access to Symfony's router. So the CacheManager generates routes and sends them as paths/URLs to the Varnish invalidator. We could then have methods in our own language (instead of Varnish jargon), such as:
* `invalidateRoute($route, array $params)` (results in purge)
* `invalidatePath($path, array $hosts?)` (results in multiple purges if multiple hosts are given)
* `invalidateRegex($regex)` (results in ban)
* `refreshRoute($route, array $params)`
* `refreshPath($path)` (both result in refresh)

But perhaps all this is overcomplicating things. I'm not sure yet. ;)