Рамка внедрения зависимостей для Cocoa?
Интерфейс Builder может использоваться для базовой инъекции зависимостей в приложении Cocoa, но кому-то известно о более полных зависимостях вложений для фреймворков для Objective-C/Cocoa, если вы не хотите создавать объекты в NIB файл?
Edit
Чтобы уточнить, я понимаю, что IB может использоваться для базового DI, но я ищу структуру с более полной функциональностью, включая отдельные конфигурации производства и тестирования, в соответствии с Groovy или Springs.
Ответы
Ответ 1
Я думаю, вы обнаружите, что вам это не нужно на поздних связующих языках, таких как Objective C, Ruby, Lisp и т.д. Как откровение Джамиса о том, что он шел по слишком сложному пути, когда он пытался создать иглу, рамочный механизм для Ruby - Net:: SSH revisited.
Вот некоторые ссылки, которые, мы надеемся, дадут вам пример кода для выполнения аналогичных действий в Objective C. С помощью категорий вы можете существенно изменить поведение любого класса во время выполнения. См. Советы разработчика Mac - Objective-C: Категории и Cocoa API-документы по категориям. По существу вам не нужно какое-то центральное место, чтобы запросить "вещь, которая делает x", которая настраивается, потому что вы можете просто создать экземпляр TheThingThatDoesX напрямую, и если что-то еще нужно изменить/вставить в это поведение, оно может использовать категории.
Ответ 2
objection от AtomicObject. Он формируется по образу Гика.
Ответ 3
Я выйду на конечность и поговорю об этом. Включение зависимостей, как описано в верхнем ответе, не касается основной проблемы, с которой сталкиваются те, кто пытается ее использовать. Нам нужны средства разработки, в которых компонент A напрямую не создает экземпляр или не ссылается на компонент B. Компонент A связан протоколом с компонентом B и вообще не ссылается на компонент A. Это позволяет заменить компонент B в любое время без касаясь компонента A. Я проголосовал, но я буду исследовать ваши ссылки, поскольку кажется, что есть несколько, которые согласны с вами. Я не пытаюсь обсуждать, просто хочу учиться. Я хотел бы больше узнать о подходе "нет, вам не нужно".
Ответ 4
Typhoon
Почти год назад я выпустил: https://github.com/typhoon-framework/Typhoon
Тайфун-сайт перечисляет основные функции. Краткое резюме:
-
неинвазивный. Никаких макросов или XML не требуется. Использует мощный Objective-C подход к развертыванию.
-
Легко иметь несколько конфигураций одного и того же базового класса или протокола.
-
Нет магических строк - поддерживает рефакторинг IDE, завершение кода и проверку времени компиляции.
-
Поддерживает инъекцию контроллеров представлений и интеграцию с раскадрой.
-
Поддерживает как инициализацию, так и вложение свойств, а также управление жизненным циклом.
-
Мощные функции управления памятью. Предоставляет предварительно сконфигурированные объекты, без накладных расходов памяти для одиночных пакетов.
-
Отличная поддержка круговых зависимостей.
-
Постный. Он имеет очень низкую площадь, поэтому он подходит для устройств с ограничениями на процессор и память.
-
Battle-tested - используется во всех видах приложений, поддерживающих Appstore
-
Являясь международно распределенной основной командой (мы даже контролируем StackOverflow), поэтому поддержка любого из ваших вопросов никогда не за горами:)
Документы API и пример приложения
Контроль качества:
Мы также поддерживаем надежную систему контроля качества.
- Каждая фиксация запускает серию регрессионных тестов
- Мы поддерживаем высокий уровень охвата тестированием.
Ответ 5
Вам не нужно создавать экземпляр объекта в файле NIB. Если вы установили владельца файла в свой класс объектов, а затем связали вещи в представлении/окне/независимо от того, вы можете установить свой объект в качестве владельца во время выполнения, загрузив файл nib вручную. Таким образом, вы можете иметь динамический экземпляр объекта, который по-прежнему получает правильно введенные зависимости.
Ответ 6
Как насчет внедрения внедрения dependecy в Objective-IOC
Ответ 7
Как насчет ObjectivePim?
ObjectivePim
Ответ 8
Ive написал очень простой контейнер DI, код находится на GitHub. Он может делать только общие основы, т.е. обнаружить зависимости объекта и удовлетворить их с помощью других заданных объектов. Я обнаружил, что для использования в реальных приложениях код очень прост и его удовольствие взломать.
Ответ 9
Кто-нибудь посмотрел на Ассоциативные ссылки в Mac OS X 10.6?
Я считаю, что с этим можно было бы построить или уже иметь нечто похожее на DI.
Насколько мне известно, любая ссылка, которая требуется в объекте, должна быть загружена вручную с помощью objc_getAssociatedObject().
Манфреда
Ответ 10
Интерфейс Builder не делает ЛЮБОЙ инъекции зависимостей. Это не нужно. Интерфейс Builder сериализует объекты. Когда нить "проснулся" (он же открыт), "никаких зависимостей" не существует - есть только свойства, которые нужно установить. Очень, очень просто. Открытие наконечника основывается исключительно на протоколе NSCoding и кодировании ключа.
Инъекция зависимостей, в значительной степени проект make-work в лучшие времена или, в лучшем случае, обобщенный слой клея между компонентами, разработанными независимо, бесполезна в хорошо написанном коде Objective-C. Вы запрашиваете инструмент, который вам не нужен.
В Objective-C программное обеспечение, требующее анонимной услуги, объявляет протокол. Затем службы принимают этот протокол. Клиенты загружают службы как динамические плагины. С другой стороны, если сервер был написан до клиента, это просто вопрос написания нового подключаемого модуля, который адаптирует существующий интерфейс к протоколу. Это меньше работы и более простой, чем попытка определить промежуточную управляемую данными систему для "обнаружения" (пожалуйста) интерфейса во время выполнения.
Разве не очевидно, что большой секрет DI заключается в том, что он способ писать код в XML, а не на родном языке? Мне бы очень хотелось услышать хороший аргумент о том, как XML - это как-то лучший язык программирования, чем настоящий язык программирования. Это не имеет никакого смысла.
Ответ 11
Я работаю с Spring весь день, и я проверил Groovy. Я отнюдь не эксперт XCode/Cocoa, но IB делает только некоторую инъекцию зависимостей, которую Groovy даже не утверждает, что делает.
Я считаю, что вы не ищете DI, а скорее для хорошо скомпилированного набора интегрированных библиотек, который избавляет вас от ввода большого количества кода, который также набрал и другие люди. Я думаю, что нет Spring подобных фреймворков для Cocoa, потому что по какой-то причине люди склонны видеть "Open Source" как "не зависящие от платформы", и поэтому Cocoa немного оставлен на холоде.
В зависимости от ваших потребностей, однако, есть несколько хороших бесплатных библиотек с открытым исходным кодом, доступных для Cocoa, все из которых перечислены в CocoaDev в nice list.
Я знаю, что это не Spring, но я надеюсь, что это поможет.
Ответ 12
DI - это свойство среды выполнения, требующей динамической привязки. Я очень новичок в Obj-C и Cocoa, поэтому я могу говорить не в свою очередь. Если я чего-то не упускаю, я не вижу, как можно реализовать DI за исключением интерпретации Obj C, а не для его компиляции, или путем изменения среды выполнения.
Я подозреваю, что поведение DI, похожее на IB, связано с тем, что существует среда, специфичная для домена, связанная с приложениями, которые построены с ней.
Я рад, что меня исправили.
Категории представляют собой реализацию mixin, позволяющую динамическую отправку методов делегату. Скорее прохладно и похоже на концепцию интерфейса Java, подумал, что детали отличаются и от следующего, я не вижу, могут ли константы быть определены в категории, хотя поля членов не могут.
objective-c категории