Я использую Castle Windsor для домашнего проекта, над которым я работаю. Я начинаю замечать, что мне нужно вызывать контейнер IoC в разных местах моего кода для создания новых объектов. Эта зависимость от контейнера усложняет поддержку моего кода.
Для решения этой проблемы я использовал два решения
Я пытался создать абстрактные фабрики в качестве оберток вокруг контейнера, которые я мог бы внедрить в части моего приложения, которые должны создавать объекты. Это работает, но имеет некоторые недостатки, потому что замку трудно внедрить свой собственный контейнер в качестве зависимости. Так что я должен сделать это вручную, этот вид поражает всю цель контейнера IoC.
Я использовал основной класс applicationcontroller, чтобы обернуть контейнер IoC и работать как центральная фабрика / хранилище. Это было довольно успешно, но этот класс становится слишком большим и действует как центральный божественный объект, почти все другие объекты имеют ссылку на него.
Оба решения работают, но оба имеют свои недостатки. Поэтому мне любопытно, если бы другие люди имели такую же проблему и нашли лучшее решение.
редактировать
Проблема не для объекта A, который зависит от объекта B. Здесь я обычно просто использую инъекцию конструктора, и все работает. Иногда у меня есть объекты типа A, которым нужно создать переменное число других объектов типа B в течение их жизни. Я не уверен, как это сделать.
@ Блэр Конрад: Проблемы с техническим обслуживанием до сих пор не являются серьезными. У меня было несколько классов, зависящих от объекта контейнера, вызывающего container.Resolve <>. И я не хочу, чтобы мой код зависел от того, что я считаю инфраструктурой. Я все еще пытаюсь что-то сделать, поэтому заметил, что мне пришлось изменить много кода при переключении с ninject на castle для этого проекта.
@ flowers: Хм. Мне нравится ваше решение кулаков. Он сочетает в себе то, что работает с обоими решениями, которые я пробовал. Я думаю, что я все еще слишком много думал об объектах и недостаточно о интерфейсах / обязанностях.
Я пробовал специально построенные фабрики, но я хотел бы, чтобы они использовали контейнер за кулисами для создания объектов, и я не нашел, как я могу DI контейнер в объекты чистым способом.