Если правильно - подключить DI Container, делать все через него.
Если без контейнера - передавать зависимости вручную. Обычно они не нужны
везде
То, о чем вы рассказываете лично я делал несколько иначе. Событий, как таковых, нету. Есть
команда, которая и есть событием. Например AttackCommand, MoveCommand, DeployCommand. Все взаимодействие идет через команды, все остальные классы - сухие данные. Соответственно всякие такие вещи нужны только командам, а они создаются через единый центр, который и делает инъекцию.
Тут я писал статью:
https://habrahabr.ru/post/322258/
https://habrahabr.ru/post/322268/
А еще, если напишете на емейл (есть в профиле), могу скинуть пример сервера ККИ на C#.