Интересный дизайн. Я вижу вашу потребность, но что вы собираетесь делать, когда требования немного меняются, так что в ответ на Foo.Epsilon app_1 должен отправить либо Bar.Gamma или Bar.Whatsit?
Решение, которое вы рассмотрели и отбросило как хакерское (помещая отношение в карту), кажется, дает вам гораздо большую гибкость и позволяет избежать вашей циркулярной ссылки. Он также сохраняет ответственность разделенной: сами типы сообщений не должны нести ответственность за знание их ответа, не так ли?