Известно, что суть двойной диспатчеризации в том, чтобы выбрать наиболее подходящий метод в зависимости от аргументов. Т.е. чуть более гибкая перегрузка методов, реализуемая визитором.
В моём случае выбирается наиболее подходящий аргумент из DI контейнера и подсовывается в метод, следуя его сигнатуре. Что-то вроде автовайринга в Spring и Symfony.
Псевдокод:
// Регистрация в контейнере
container = new Container();
container.registerInstance(UserRepositoryInterface, repository);
// Сам класс
class Some {
method(UserRepositoryInterface users) { ... }
}
// Непосредственно вызов
some = new Some();
container.callMethod(some, "method");
Т.е. вызывается метод "method", используя некий паттерн матчинг для аргументов.