Инверсия контейнера управления
-
03-07-2019 - |
Вопрос
Какие наиболее важные функции должен содержать контейнер IOC?Вы можете легко создавать контейнеры в 15 строк кода, но что оно должно включать в себя, чтобы быть «полезным» в проекте?
Решение
Это довольно широко открытая тема, в которой много субъективизма, но я постараюсь ответить с очень прагматичной точки зрения.Учитывая проекты, над которыми я работал, и мой опыт работы с IoC, я бы сказал, что с точки зрения полезности следует искать как минимум трех важных игроков.
- Конфигурация — Любой IoC, который вы используете, должен иметь какое-то центральное расположение, позволяющее вам настраивать поведение этого контейнера.Будь то файл конфигурации или хороший набор вызовов API, которые можно обернуть где-нибудь в глобальный класс, если контейнер нелегко настроить, это будет головная боль.
- Пожизненное управление - Вам действительно нужен контейнер, способный обеспечивать различное время жизни объектов.Возможно, вы захотите, чтобы определенный объект всегда получал новый IPersonCreator, но вам нужно, чтобы в любой момент времени существовал только один IPersonService.
- Автоматическое внедрение зависимостей - Хорошо, итак, внедрение зависимостей — это концепция, на которой построен IoC, но вам не нужно управлять этим самостоятельно.Идея здесь заключается в том, что если вы впервые запрашиваете IPersonCreator, он должен автоматически разрешить все свои зависимости, их зависимости и т. д.
В целом то, что вам нужно, зависит от проекта, но есть несколько контейнеров, которые отлично подойдут вашим потребностям.
Другие советы
В порядке убывания важности:
- Разрешить внедрение как минимум установщика и конструктора,
- Отделить конфигурацию от кода,
- Разрешить различные стили конфигурации (XML или аннотации),
Для этого потребуется более 15 строк кода, но мне они кажутся ключевыми.
Не связан с StackOverflow