Как я могу реализовать сервисный шаблон локатора в Касании Какао через несколько проектов?

Это - проблема, которая прослушивала меня некоторое время теперь. Я являюсь все еще довольно новым с некоторыми из этих шаблонов, таким образом, необходимо будет простить мне (и исправить меня), если я использую какой-либо из терминов неправильно.

Моя методология

Я создал игровой механизм. Все объекты в моем игровом механизме используют инверсию управления для получения зависимостей. К этим зависимостям все протоколы реализации и никогда не получают доступ непосредственно в проекте, кроме во время загружающейся фазы. Для получения этих объектов у меня есть понятие сервисного локатора. Сервисное задание локатора состоит в том, чтобы определить местоположение объекта, который соответствует определенному протоколу, и возвратите его. Это много похоже на фабрику, но это должно обработать зависимости также.

Для предоставления услуг сервисному локатору я имею то, что я называю сервисными спецификаторами. Сервисный локатор знает обо всех сервисных спецификаторах в проекте, и когда объект требуют, попытки получить экземпляр объекта, соответствующего предоставленному протоколу от каждого из них. Этот объект затем возвращается вызывающей стороне. Что в моде о настроенном сервисный спецификатор, также знает о сервисном локаторе, поэтому если он имеет какие-либо зависимости, он просто просит у сервисного локатора те определенные зависимости.

Для предоставления примера у меня есть объект под названием HighScoreManager. HighScoreManager реализует протокол PHighScoreManager. Когда-либо, если экземпляр PHighScoreManager требуется, он может быть получен путем вызова:

id<PHighScoreManager> highScoreManager = [ServiceLocator resolve: @protocol(PHighScoreManager)];

Таким образом, инверсия управления. Однако большую часть времени даже не необходимо сделать это, потому что большинство классов расположено в сервисном спецификаторе, если один необходимый PHighScoreManager как зависимость, то это получено через сервисный локатор. Таким образом у меня есть хороший плоский подход к инверсии управления.

Моя проблема

Поскольку я хочу, чтобы код от моего игрового механизма был совместно использован, мне скомпилировали его как статической библиотеке. Это работает потрясающее на все остальное, но, кажется, становится немного хитрым с сервисным локатором. Проблемой является некоторое сервисное изменение на игре к игровому основанию. В моем выше примера счет в одной игре мог бы быть временем, и в другом это могли бы быть точки. Таким образом HighScoreManager зависит от экземпляра PHighScoreCreator, который говорит его, как создать объект PScore.

Чтобы предоставить PHighScoreCreator HighScoreManager, у меня должен быть сервисный спецификатор для моей игры. Единственным путем я мог думать для выполнения, это должно было использовать версию Какао отражений. После рытья вокруг, я узнал, что классы были поддающимися обнаружению через NSBundle, но кажется, что нет никакого способа получить текущий пакет. Таким образом, если бы я хочу смочь найти свои сервисные спецификаторы, я должен был бы скомпилировать свою игровую логику в ее собственный пакет и затем иметь механизм, находят этот пакет и загружают его. Чтобы сделать это, я должен был бы создать третий проект содержать и код двигателя и игровой пакет логики, когда в действительности я хотел бы просто иметь игровой проект, который использовал механизм статическая библиотека.

Мой реальный вопрос

Таким образом, после всего этого, мой вопрос

  1. Есть ли лучший способ сделать то, что я пытаюсь выполнить в Касании Какао, или
  2. Существует ли способ обнаружить классы, которые соответствуют моему сервисному протоколу спецификатора от основного пакета?

Спасибо за справку и занимающий время для чтения вопрос.

- helixed

8
задан LandonSchropp 6 August 2010 в 04:29
поделиться

1 ответ

Взгляните на:

  • + [NSBundle mainBundle];
  • + [NSBundle bundleForClass:];
  • + [NSBundle bundleWithIdentifier:];
  • + [NSBundle allBundles];
  • + [NSBundle allFrameworks];

Они позволяют вам программно взаимодействовать с различными пакетами во время выполнения. Если у вас есть пакет для работы, вы можете использовать ряд стратегий, чтобы найти конкретный класс (классы), который вы ищете. Например:

  1. Получить идентификатор пакета - это будет NSString, например @ "com.example.GameEngineClient".
  2. Преобразуйте его в допустимое имя класса Objective-C, удалив все до последней точки, или заменив все точки подчеркиванием или чем-то еще, а затем добавив предварительно определенное имя протокола. Например, ваш протокол, указанный выше, может привести к строке типа @ "GameEngineClient_PHighScoreManager".
  3. Получите назначенный класс пакета для вашего протокола с помощью NSClassFromString ().

Теперь вы можете создать экземпляр класса, предоставленного автором пакета, который реализует любой указанный вами протокол.

Среда выполнения Objective-C - прекрасная вещь!

1
ответ дан 6 December 2019 в 01:39
поделиться