ИМХО не рекомендуется вставлять весь контейнер в класс или иметь статический локатор службы IoC для всего приложения.
Вы хотите видеть из конструктора класса (давайте назовем его Foo), какие сервисы / объекты он использует для выполнения работы. Это улучшает ясность, тестируемость и разложимость.
Допустим, Foo нужна только служба электронной почты, но я передаю весь контейнер и где-то в коде служба электронной почты получает разрешение из контейнера. В этом случае будет очень трудно следовать. Вместо этого лучше внедрить почтовый сервис напрямую, чтобы прояснить зависимости Foo.
Если Foo необходимо создать несколько экземпляров службы электронной почты, лучше создать и внедрить EmailServiceFactory (через контейнер IoC), который будет создавать необходимые экземпляры на лету.
В последнем случае зависимости Foo по-прежнему указываются как можно более конкретными - только те, которые может создать EmailServiceFactory. Если бы я внедрил весь контейнер, было бы непонятно, какие именно услуги предоставляются им - это точные зависимости Foo.
Теперь, если позже я захочу предоставить разные экземпляры службы электронной почты, я поменяю ее внутри EmailServiceFactory. Я мог бы также поменять всю фабрику, если все службы, которые она создает, нужно поменять местами (например, во время тестирования).
Таким образом, за счет создания одного дополнительного класса (фабрики) я получаю гораздо более чистый код, и мне не придется беспокоиться о любопытных ошибках, которые могут возникнуть при использовании глобальной статики. Кроме того, когда я поставляю макеты для тестирования, я точно знаю, что им нужно, и мне не нужно макетировать типы контейнеров целиком.
Этот подход также имеет преимущество в том, что теперь, когда модуль инициализируется (применяется только к Prism / Modularity), ему не нужно регистрировать все типы объектов, которые он предоставляет в контейнер IoC. Вместо этого он может просто зарегистрировать свой ServiceFactory, который затем предоставляет эти объекты.
Для ясности, класс инициализации модуля (реализует IModule) должен по-прежнему получать контейнер IoC всего приложения в своем конструкторе, чтобы предоставлять сервисы, которые используются другими модулями, но контейнер не должен вторгаться в классы модуля.
Наконец, у нас есть еще один прекрасный пример того, как дополнительный слой косвенности решает проблему.