Quick Start

Jasper Blues edited this page Aug 9, 2017 · 49 revisions

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

First, create a sub-class of TyphoonAssembly

Add the method names in the header. This will allow compile-time checking and IDE code-completion.

@interface MiddleAgesAssembly : TyphoonAssembly

- (Knight*)basicKnight;

- (Knight*)cavalryMan;

- (id<Quest>)defaultQuest;

@end

Now simply define instances to be built

Let's 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 assembly as follows:

MiddleAgesAssembly *mas = [[MiddleAgesAssembly new] activate];
Knight* knight = [mas basicKnight]; 

And we're done!



Key Concept

Before activation each method 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.