Можете ли вы выполнить инъекцию зависимостей в target-c? - PullRequest
3 голосов
/ 09 января 2011

В настоящее время я жестко кодирую другой объект напрямую, когда это необходимо, и мне бы хотелось иметь возможность воспринимать это через метод init (я полагаю?). В приведенном ниже коде я создаю новый HatService в методе viewDidLoad, и я бы предпочел не делать этого из соображений тестируемости / связности.

- (void)viewDidLoad
{
    [super viewDidLoad];
    HatService* hatService = [[HatService alloc] init];
    [hatService getHatById:self];
}

Первый вопрос - как это сделать в target-c? Второй вопрос - должен ли я волноваться об этом или делать это вообще?

Обновление

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

Примечание. Я могу выполнить это вручную, когда сам создаю объект, но когда appDeleage выполняет работу, я не вижу, чтобы это произошло (как делегат приложения создает этот объект без вызова моего метода init?)

-(id)initWithHatService:(HatService *)service
{
  if (self = [super init])
  {
    [self setService:service];
  }
  return self;
}

-(id)init
{
  HatService* hatService = [[HatService alloc] init];
  return [self initWithHatService:hatService];
}

Ответы [ 3 ]

6 голосов
/ 11 января 2011

Назначенный инициализатор для UIViewController - - (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle. Вам нужно переопределить этот метод, если вы хотите, чтобы ваш контроллер представления был правильно создан из файла пера, если это то, что вы пытаетесь сделать. Не увидев больше кода, невозможно сказать, но этот метод определенно вызывается где-то.

Во-вторых, вам нужно переписать ваш -init метод, чтобы он выглядел так:

- (id)init {
    return [self initWithHatService:nil];
}

Каждый метод init должен вызывать указанный вами инициализатор.

Наконец, когда вы имеете дело с контроллерами представления, люди обычно не передают свойства в методе init. Создайте новый контроллер и передайте ему любые свойства службы, которые вам нравятся.

MyViewController *newContrlr = [[MyViewController alloc] initWithNibName:nil bundle:nil];
newContrlr.hatService = [[[HatService alloc] init] autorelease];
1 голос
/ 09 января 2011

Если вы спрашиваете, как передать объект методу init другого объекта, просто объявите ваш метод init как принимающий один или несколько аргументов. то есть - (id) initWithHatService:(HatService *)serv; методы init не являются чем-то особенным, кроме соглашения в target-c.

Не имеет отношения: ваш -getHatById: метод любопытен. Какова семантика управления памятью этого? Методы с префиксом get довольно редко встречаются в программах Какао.

0 голосов
/ 28 февраля 2013

В Objective-C довольно легко реализовать шаблон проектирования внедрения зависимостей. Вы можете сделать это вручную, создав класс «сборка приложения», который определяет отдельных соавторов.

В качестве альтернативы, вы можете использовать рамки для помощи. Недавно я создал DI-контейнер под названием Typhoon: http://www.typhoonframework.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...