Register a Logger service and inject it into a program.
← Dependency Injection · Ref: Q1110
Register concrete as abstract, inject with ! suffix:
register ConsoleLogger() as Logger ... service as Logger!
The ! suffix marks an injection point. The compiler validates a matching registration exists.
See Q227 for compile-time DI validation. See Q228 for registration ordering.
Example
defines module qa.di.registerinjectbasic 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 ? defines application BasicApp register ConsoleLogger() as Logger defines program RegisterInjectBasicDemo() with application of BasicApp stdout <- Stdout() //Injected via '!' suffix — compiler verified logger as Logger! result <- logger.log("Application started") stdout.println(result)
Common mistakes
E08210 — Every injection point (!) must have a matching registration in the application. The compiler rejects missing registrations.
Incorrect:
//missing registration
Correct:
register ConsoleLogger() as Logger
Other ways to ask this
- I need to wire a component into a program using EK9's DI system
- In Spring I'd use @Autowired to inject a service. Write the EK9 equivalent
- Given an abstract Logger and concrete ConsoleLogger, register and inject it
- Set up an application that provides a Logger to a program via injection
Coming from another language?
Spring: @Autowired Logger logger. Guice: @Inject Logger logger. .NET: services.AddSingleton<ILogger, ConsoleLogger>(). EK9: register + '!' suffix injection.
Keywords: !, register, application, DI, wire, inject, component