Это - проблема, которая прослушивала меня некоторое время теперь. Я являюсь все еще довольно новым с некоторыми из этих шаблонов, таким образом, необходимо будет простить мне (и исправить меня), если я использую какой-либо из терминов неправильно.
Моя методология
Я создал игровой механизм. Все объекты в моем игровом механизме используют инверсию управления для получения зависимостей. К этим зависимостям все протоколы реализации и никогда не получают доступ непосредственно в проекте, кроме во время загружающейся фазы. Для получения этих объектов у меня есть понятие сервисного локатора. Сервисное задание локатора состоит в том, чтобы определить местоположение объекта, который соответствует определенному протоколу, и возвратите его. Это много похоже на фабрику, но это должно обработать зависимости также.
Для предоставления услуг сервисному локатору я имею то, что я называю сервисными спецификаторами. Сервисный локатор знает обо всех сервисных спецификаторах в проекте, и когда объект требуют, попытки получить экземпляр объекта, соответствующего предоставленному протоколу от каждого из них. Этот объект затем возвращается вызывающей стороне. Что в моде о настроенном сервисный спецификатор, также знает о сервисном локаторе, поэтому если он имеет какие-либо зависимости, он просто просит у сервисного локатора те определенные зависимости.
Для предоставления примера у меня есть объект под названием HighScoreManager. HighScoreManager реализует протокол PHighScoreManager. Когда-либо, если экземпляр PHighScoreManager требуется, он может быть получен путем вызова:
id<PHighScoreManager> highScoreManager = [ServiceLocator resolve: @protocol(PHighScoreManager)];
Таким образом, инверсия управления. Однако большую часть времени даже не необходимо сделать это, потому что большинство классов расположено в сервисном спецификаторе, если один необходимый PHighScoreManager как зависимость, то это получено через сервисный локатор. Таким образом у меня есть хороший плоский подход к инверсии управления.
Моя проблема
Поскольку я хочу, чтобы код от моего игрового механизма был совместно использован, мне скомпилировали его как статической библиотеке. Это работает потрясающее на все остальное, но, кажется, становится немного хитрым с сервисным локатором. Проблемой является некоторое сервисное изменение на игре к игровому основанию. В моем выше примера счет в одной игре мог бы быть временем, и в другом это могли бы быть точки. Таким образом HighScoreManager зависит от экземпляра PHighScoreCreator, который говорит его, как создать объект PScore.
Чтобы предоставить PHighScoreCreator HighScoreManager, у меня должен быть сервисный спецификатор для моей игры. Единственным путем я мог думать для выполнения, это должно было использовать версию Какао отражений. После рытья вокруг, я узнал, что классы были поддающимися обнаружению через NSBundle, но кажется, что нет никакого способа получить текущий пакет. Таким образом, если бы я хочу смочь найти свои сервисные спецификаторы, я должен был бы скомпилировать свою игровую логику в ее собственный пакет и затем иметь механизм, находят этот пакет и загружают его. Чтобы сделать это, я должен был бы создать третий проект содержать и код двигателя и игровой пакет логики, когда в действительности я хотел бы просто иметь игровой проект, который использовал механизм статическая библиотека.
Мой реальный вопрос
Таким образом, после всего этого, мой вопрос
Спасибо за справку и занимающий время для чтения вопрос.
- helixed
Взгляните на:
Они позволяют вам программно взаимодействовать с различными пакетами во время выполнения. Если у вас есть пакет для работы, вы можете использовать ряд стратегий, чтобы найти конкретный класс (классы), который вы ищете. Например:
Теперь вы можете создать экземпляр класса, предоставленного автором пакета, который реализует любой указанный вами протокол.
Среда выполнения Objective-C - прекрасная вещь!