Skip to content

Quick Start

Jasper Blues edited this page Feb 15, 2015 · 49 revisions

Setting up a Dependency Injection container couldn't be more easy.

First, create a sub-class of TyphoonAssembly:

@interface MiddleAgesAssembly : TyphoonAssembly

- (Knight*)basicKnight;

- (Knight*)cavalryMan;

- (id<Quest>)defaultQuest;

@end

Add the method names in the header. This will allow compile-time checking and IDE code-completion. Now simply define instances to be built:


###Perform an Initializer Injection

- (Knight*)basicKnight
{
    return [TyphoonDefinition withClass:[Knight class] 
        configuration:^(TyphoonDefinition* definition)
    {
        [definition useInitializer:@selector(initWithQuest:) 
            parameters:^(TyphoonMethod *initializer) {

            [initializer injectParameterWith:[self defaultQuest]];

        }];
    }];
}

- (id<Quest>)defaultQuest
{
    return [TyphoonDefinition withClass:[CampaignQuest class]];
}

###Obtain built instances from the container as follows:

MiddleAgesAssembly *assembly = [MiddleAgesAssembly assembly];
[[TyphoonAssemblyActivator withAssemblies:@[assembly]] activate];
Knight* knight = [assembly basicKnight]; 

And we're done!


  • We can proceed from one object graph to another, by injecting the assembly.
  • For fully Typhoon-powered apps we can bootstrap using plist integration. This gives AppDelegate injection and tight Storyboard integration, including the use of (Auto-injection)[Auto-injection (Objective-C)] macros on view controllers.

Key Concept: Before activation each method returns in a TyphoonAssembly returns a TyphoonDefinition. After activation we'll use the same interface to return built instances. Since the main use for your assembly interfaces will be emitting built components, you can declare the return type as the type being built.