В общем, как только вы переходите на IoC, вы, как правило, хотите зарегистрировать ВСЕ в IoC, и контейнер выплевывает полностью гидратированные объекты.Тем не менее, вы поднимаете некоторые действительные пункты.
Возможно, определение «зависимости» в порядке;в самом широком смысле, зависимость - это просто набор функциональных возможностей (интерфейса), для которого данный класс требует конкретной реализации, чтобы класс работал правильно.Таким образом, большинство нетривиальных программ полны зависимостей.Для обеспечения простоты обслуживания, как правило, предпочтительным является слабое соединение всех зависимостей.Однако даже в случае слабой связи вам не нужно автоматизировать создание экземпляров зависимостей, если эти объекты требуют специализированной информации, которой вы не хотите загрязнять реестр IoC.Цель состоит в том, чтобы объединить использование, а не создание.
Что касается пункта 1, некоторые платформы IoC плохо справляются с заданными внешними параметрами.Однако обычно вы можете зарегистрировать делегата как фабричный метод.Этот делегат может принадлежать объекту, подобному контроллеру, которому пользовательский интерфейс предоставляет внешнюю информацию.Вход в систему - прекрасный пример: создайте объект, скажем LoginController, и зарегистрируйте его в IoC в качестве ILoginController.Вы будете ссылаться на этот контроллер на своей странице входа в систему, он будет введен при создании экземпляра страницы входа в систему, и страница входа передаст ему введенные учетные данные.Затем Контроллер выполнит аутентификацию и будет иметь метод GetAuthenticatedUser (), который создает объект User.Вы можете зарегистрировать этот метод в IoC в качестве фабрики для пользователей, и всякий раз, когда требуется пользователь, делегат фабрики либо оценивается, либо передается оптом зависимому методу, который будет вызывать его, когда ему действительно нужен пользователь.
В пункте 2 установка отдельного экземпляра объекта является сильной стороной шаблона IoC.Вместо того, чтобы создавать настоящий одноэлементный объект с частным конструктором экземпляра, статическим экземпляром и статическим конструктором для создания экземпляра, вы просто регистрируете класс в IoC и говорите ему, чтобы он создавался только один раз и использовал этот экземпляр для всех запросов.Сила в гибкости;если позже вы захотите, чтобы было более одного экземпляра, просто измените регистрацию.В любом случае вы не нарушите никаких правил шаблона проектирования;в представление всегда будет вставлен контроллер, независимо от того, является ли этот контроллер одинаковым для всех страниц или новым экземпляром для каждого запроса.