Define an application that wires three components together.
← Dependency Injection · Ref: Q1113
Create the DI registry and connect it to a program:
defines application MyApp register ConsoleLogger() as Logger register GreetingService() as Service
defines program Main() with application of MyApp service as Service! stdout <- Stdout() stdout.println(service.greet("World"))
'with application of' connects the program to the registry. All injection points resolve from this application.
See Q1110 for register/inject basics. See Q228 for ordering.
Example
defines module qa.di.applicationregistry defines component Logger as abstract log() as abstract -> message as String <- output as String? default operator ? ConsoleLogger is Logger override log() -> message as String <- output as String: `[LOG] ${message}` default operator ? Formatter as abstract format() as abstract -> text as String <- result as String? default operator ? UpperFormatter is Formatter override format() -> text as String <- result as String: text.upperCase() default operator ? Service as abstract greet() as abstract -> name as String <- greeting as String? default operator ? GreetingService is Service logger as Logger! formatter as Formatter! override greet() -> name as String <- greeting <- String() formatted <- formatter.format(name) greeting: logger.log(formatted) default operator ? defines application GreetApp register ConsoleLogger() as Logger register UpperFormatter() as Formatter register GreetingService() as Service defines program ApplicationRegistryDemo() with application of GreetApp stdout <- Stdout() service as Service! result <- service.greet("World") stdout.println(result)
Common mistakes
E08220 — A program that uses DI injection must be linked to its application with 'with application of AppName' (EK9 has no wiring annotations). See ek9 -h E08220 for details.
Incorrect:
ApplicationRegistryDemo()
Correct:
ApplicationRegistryDemo() with application of GreetApp
Other ways to ask this
- I need an application block that registers Logger, Formatter, and Service
- In Spring I'd use @Configuration with @Bean methods. Write the EK9 application
- Given three components with dependencies, define the application wiring
- Set up a complete application registry with multiple registrations
Coming from another language?
Spring: @SpringBootApplication + @Configuration. Guice: AbstractModule.configure(). .NET: Program.cs with builder.Services. EK9: defines application with register statements.
Keywords: wire, register, registry, configuration, application, DI