Вопрос по DI и как решить некоторые проблемы

Я новичок в Injection Dependency. Я никогда не использовал и даже никогда не понимал, что это такое, но после моей последней атаки на эту тему я обнаружил, что это способ разъединения объекта и его зависимостей, поскольку они не отвечают за создание экземпляров конкретных версий его зависимостей больше нет, так как теперь контейнер сделает это за нас и доставит готовый объект в наши руки.

Теперь дело в том; "когда я должен использовать это?", ВСЕГДА??? На самом деле, поскольку я новичок и даже никогда не видел проекта, использующего этот шаблон, я не могу понять, как я должен применять его к своим предметным объектам!!! Мне кажется, что я больше никогда не буду создавать экземпляры своих объектов, а контейнер всегда будет делать это за меня, но тут возникают некоторые сомнения...

1) Как насчет ooobjects, что часть его зависимостей происходит, например, от пользовательского интерфейса;

public class User(String name, IValidator validator)

Скажем, я получаю имя пользователя из пользовательского интерфейса, так как же контейнер узнает его и все равно доставит этот объект для меня?

2) Есть другая ситуация, с которой я сталкиваюсь; если зависимость теперь является объектом, который уже создан, скажем... объект SINGLETON, например. Я видел настройки, касающиеся сферы жизни внедренной зависимости (я говорю о Spring.NET, например, о области HTTP-запроса)... НО, запрос и другие вещи, связанные с Интернетом, находятся на моем уровень представления, так как я могу связать как уровень представления, так и уровень домена, не нарушая никаких правил проектирования (поскольку мой домен должен совершенно не знать, где он используется, не иметь зависимости от уровня и т. д.)

Я хочу услышать от вас всех. Большое спасибо.


person Renato Gama    schedule 25.03.2011    source источник
comment
Сегодня много вопросов по DI =) Посмотрим, поможет ли этот ответ. :stackoverflow. ком/вопросы/5433211/   -  person gideon    schedule 25.03.2011
comment
Это полезно @giddy, спасибо, но не совсем в этом дело! знак равно   -  person Renato Gama    schedule 25.03.2011
comment
@Renato просто подумал, что это поможет объяснить, почему используется DI. знак равно   -  person gideon    schedule 25.03.2011
comment
@giddy действительно помогает моему другу! Я прочитал и проголосовал за ваш ответ, мне было совершенно ясно. Что случилось, так это то, что я уже понял то, что вы там объяснили, поэтому я думаю, что мои сомнения немного дальше этого вопроса. Спасибо за беспокойство дружище! ценить!   -  person Renato Gama    schedule 25.03.2011
comment
связанные: stackoverflow.com/questions/1943576/   -  person Mark Seemann    schedule 25.03.2011
comment
связанные: stackoverflow.com/questions/4835046/   -  person Mark Seemann    schedule 25.03.2011
comment
связанные: stackoverflow.com/questions/1475575/   -  person Mark Seemann    schedule 25.03.2011
comment
связанные: stackoverflow.com/questions/150980/   -  person Mark Seemann    schedule 25.03.2011
comment
@Марк, спасибо, я все проверю!!!   -  person Renato Gama    schedule 25.03.2011
comment
@ Ренато: Нет проблем. Большинство ваших вопросов носят концептуальный характер. Некоторые из предоставленных мной ссылок могут на первый взгляд показаться вам неактуальными, потому что они спрашивают о других контейнерах и т. д., но вы сможете извлечь некоторые общие рекомендации из ответов.   -  person Mark Seemann    schedule 25.03.2011


Ответы (3)


В общем, как только вы переходите на IoC, вы, как правило, хотите зарегистрировать ВСЕ с помощью IoC и заставить контейнер выплевывать полностью гидратированные объекты. Тем не менее, вы поднимаете некоторые важные моменты.

Возможно, определение «зависимости» уместно; в самом широком смысле зависимость — это просто набор функций (интерфейсов), которые данный класс требует конкретной реализации для корректной работы класса. Таким образом, большинство нетривиальных программ полны зависимостей. Для облегчения сопровождения обычно предпочтительна слабая связь всех зависимостей. Однако даже в случае слабой связи вам не нужно автоматизировать создание экземпляров зависимостей, если для этих объектов требуется специализированная информация, которой вы не хотите загрязнять свой реестр IoC. Цель состоит в том, чтобы слабо связать использование, а не обязательно создание.

Что касается пункта 1, некоторые платформы IoC плохо справляются с внешними параметрами. Однако обычно вы можете зарегистрировать делегата в качестве фабричного метода. Этот делегат может принадлежать объекту, например контроллеру, который получает внешнюю информацию от пользовательского интерфейса. Прекрасным примером являются логины: создайте объект, скажем, LoginController, и зарегистрируйте его в IoC как свой ILoginController. Вы будете ссылаться на этот контроллер на своей странице входа, он будет внедрен при создании экземпляра страницы входа, и страница входа передаст ему введенные учетные данные. Затем контроллер выполнит аутентификацию и будет иметь метод GetAuthenticatedUser(), который создает объект пользователя. Вы можете зарегистрировать этот метод в IoC как фабрику для пользователей, и всякий раз, когда потребуется пользователь, делегат фабрики будет либо оцениваться, либо полностью передаваться зависимому методу, который будет вызывать его, когда ему действительно нужен пользователь.

В пункте 2 настройка одного экземпляра объекта является сильной стороной шаблона IoC. Вместо того, чтобы создавать настоящий синглтон с частным конструктором экземпляра, статическим экземпляром и статическим конструктором для создания экземпляра, вы просто регистрируете класс с помощью IoC и говорите ему создавать его экземпляр только один раз и использовать этот экземпляр для всех запросов. Сила — это гибкость; если позже вы захотите, чтобы их было более одного экземпляра, вы просто измените регистрацию. В любом случае вы не нарушите никаких правил шаблонов проектирования; представление всегда будет иметь введенный контроллер, независимо от того, является ли этот контроллер одинаковым для всех страниц или новым экземпляром для каждого запроса.

person KeithS    schedule 25.03.2011

1) этот конструктор, вероятно, не подходит для использования, возможно, вы вводите валидатор не в то место/способ.

2) Ни представление, ни модель, ни контроллер не должны знать о наличии IoC, он должен лежать в фоновой архитектуре (где фактически создаются экземпляры компонентов MVC)

Вы должны использовать IoC, когда чувствуете, что архитектура может стать сложной и должна поддерживаться многими людьми. Если вы пишете корпоративное приложение или пользовательский интерфейс, который вы планируете расширить с помощью плагинов, он вам, вероятно, понадобится, если вы пишете утилиту командной строки, вероятно, нет.

person Felice Pollano    schedule 25.03.2011

Вы должны использовать внедрение зависимостей всякий раз, когда вам нужны какие-либо из следующих преимуществ:

  • Возможность легкой замены модулей
  • Возможность повторного использования модулей между частями приложения или разными приложениями
  • Когда вы хотите заниматься параллельной разработкой, чтобы компоненты системы можно было разрабатывать изолированно и параллельно, потому что они зависят от абстракций.
  • Когда вы хотите упростить обслуживание системы из-за слабой связанности
  • Когда вам нужна тестируемость (специализация по замене модулей). Это одна из основных причин использования DI.

Чтобы ответить на другие ваши вопросы:

1) Вы можете настроить множество контейнеров IoC, чтобы можно было указать определенные параметры конструктора, в то время как другие разрешались контейнером. Однако вам, возможно, придется подумать о рефакторинге этого фрагмента кода, так как UserFactory может быть более подходящим, который принимает зависимость от валидатора и имеет метод NewUser, который принимает имя пользователя и возвращает нового пользователя (либо создавая его экземпляр напрямую, либо разрешая из контейнер).

2) Каждое приложение, которое вы создаете, будет иметь корень композиции, в котором настроен ваш контейнер, и разрешен корневой объект. Таким образом, каждое приложение будет иметь свою собственную конфигурацию IoC, поэтому существует ожидаемая связь между типом приложения и параметрами конфигурации. Любые общие регистрации абстракций могут быть помещены в код конфигурации, который может использоваться всеми приложениями.

person devdigital    schedule 25.03.2011